提交时间:2024-10-02 12:41:52
运行 ID: 32826
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define p_b push_back #define m_p make_pair using namespace std; typedef long long ll; const int maxn=2e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } ll s1,s2,a[maxn]; double res; int n,vis[maxn]; vector<int>v[maxn],g[maxn]; int dfn[maxn],low[maxn],stk[maxn],tp,instk[maxn],bel[maxn],deg[maxn],ct,cc; ll S[maxn],SS[maxn]; int stt[maxn]; void dfs(int u){ dfn[u]=low[u]=++ct,stk[++tp]=u,instk[u]=1; for(int x:v[u]){ if(!dfn[x])dfs(x),low[u]=min(low[u],low[x]); else if(instk[x])low[u]=min(low[u],dfn[x]); }if(dfn[u]==low[u]){++cc; while(tp){ int x=stk[tp--]; instk[x]=0,bel[x]=cc; S[cc]+=a[x];SS[cc]+=a[x]*a[x]; if(x==u)break; } } }vector<int>X; void topo(){ queue<int>q; up(i,1,cc)if(!deg[i])q.push(i); X.p_b(0); while(!q.empty()){ int u=q.front();q.pop(); X.p_b(u); for(int x:g[u]){ stt[x]|=(1<<u); if(!(--deg[x]))q.push(x); } } } ll dp[maxn]; void DFS(int u,int st){ if(u>cc){ res=max(res,s1*s1*1.0/s2);return; } DFS(u+1,st); if((st&stt[X[u]])==stt[X[u]]){ s1+=S[u],s2+=SS[u];DFS(u+1,st|(1<<X[u])); s1-=S[u],s2-=SS[u]; } } void slv(){ n=read();int m=read(); up(i,1,n)a[i]=read(); if(!m){ memset(dp,0x3f,sizeof(dp)); dp[0]=0; int M=1000*n; up(i,1,n){ down(j,M,a[i])dp[j]=min(dp[j],dp[j-a[i]]+a[i]*a[i]); }double res=0; up(i,1,M)if(dp[i]>0)res=max(res,i*i*1.0/dp[i]); printf("%.10lf",res); return; } while(m--){ int x=read(),y=read(); v[x].p_b(y); }//dfs(1);printf("%.10lf",res); up(i,1,n)if(!dfn[i])dfs(i); set<pi>st;up(i,1,n)for(int x:v[i])if(bel[i]!=bel[x]&&(!st.count(m_p(bel[i],bel[x])))){ st.insert(m_p(bel[i],bel[x])); g[bel[x]].p_b(bel[i]),++deg[bel[i]]; }topo();DFS(1,0); printf("%.10lf\n",res); }int main(){ //freopen("sale.in","r",stdin); //freopen("sale.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }