Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
33018 baka24 【S】T4 C++ 通过 100 50 MS 8856 KB 3126 2024-10-02 19:54:57

Tests(70/70):


#include<bits/stdc++.h> using namespace std; #define int long long #define double long double #define it __int128 #define lson pos<<1 #define rson pos<<1|1 #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back #define x1 gczkaioi #define y1 lylakioi #define yjbakioi true #define popcnt __builtin_popcount #define inx(u) int I=h[u],v=edge[I].v,w=edge[I].w;I;I=edge[I].nx,v=edge[I].v,w=edge[I].w int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c==EOF)return -1;if(c=='-')f=-1;c=getchar();}x=c-'0';c=getchar();while(c<='9'&&c>='0'){x*=10;x+=c-'0';c=getchar();}return x*f;} const int MAXN=1000010,MAXM=2000010,N=100000000,base=131,Mod=1000000007,Mod2=999911659,inf=1000000000000000000,B=1000; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod,y>>=1;}return rt;} string ejz(int x){string s="";for(int i=0;i<4;i++)s+=x&(1<<i)?"1":"0";return s;} struct Edge{int v,w,nx;}edge[MAXM<<1];int h[MAXN],cut[MAXN],CNT=1;void Init(){memset(cut,0,sizeof(cut));CNT=1;} void add_side(int u,int v,int w){ // if(w==inf)cout<<u<<" "<<v<<" "<<"__"<<endl; // else cout<<u<<" "<<v<<" "<<w<<endl; edge[++CNT]={v,w,cut[u]};cut[u]=CNT;edge[++CNT]={u,0,cut[v]};cut[v]=CNT;} int cnt,s,t,dis[MAXN]; queue<int>Q; bool BFS(){ for(int i=0;i<=cnt;i++)dis[i]=0,h[i]=cut[i]; while(!Q.empty())Q.pop(); Q.push(s);dis[s]=1; while(!Q.empty()){ int u=Q.front();Q.pop(); if(u==t)return yjbakioi; for(inx(u))if(!dis[v]&&w){ dis[v]=dis[u]+1; Q.push(v); } } return 0; } int DFS(int u,int sum){ if(u==t||!sum)return sum; int num=sum; for(inx(u)){ h[u]=I; if(dis[v]!=dis[u]+1)continue; int go=DFS(v,min(w,num)); edge[I].w-=go,edge[I^1].w+=go,num-=go; if(!num)break; } return sum-num; } int res; int picnic(){ res=0; while(BFS()){ res+=DFS(s,inf); } return res; } int n,m,Tot,u[MAXN],v[MAXN],a[MAXN]; int p1(int x,int y){return (x-1)*n+y;} int p2(int x){return n*n+x;} bool check(int x){ // cout<<((double)x/10)<<":"<<endl; int ans=0; Init(); s=n*n+n+1,t=cnt=s+1; for(int i=1;i<=m;i++){ add_side(p2(u[i]),p2(v[i]),inf); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)if(i!=j){ add_side(s,p1(i,j),a[i]*a[j]*N); ans+=a[i]*a[j]*N; add_side(p1(i,j),p2(i),inf); add_side(p1(i,j),p2(j),inf); } for(int i=1;i<=n;i++){ add_side(p2(i),t,x*a[i]*a[i]); } int tmp=picnic(); // cout<<ans<<" "<<tmp<<endl; return ans-tmp>0; } void slv(){ n=read(),m=read(); for(int i=1;i<=n;i++)a[i]=read(); s=n*n+n+1,t=cnt=s+1; for(int i=1;i<=m;i++){ u[i]=read(),v[i]=read(); } int l=1,r=N*100000ll; while(l<r){ int mid=(l+r+1)>>1; if(check(mid-1))l=mid; else r=mid-1; } printf("%.6Lf",(double)l/N+1); } signed main(){ slv(); return 0; }


测评信息: