Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
32944 | LYLAKIOI | 【S】T4 | C++ | 解答错误 | 1 | 47 MS | 9072 KB | 3003 | 2024-10-02 15:34:25 |
#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; const double eps=1e-7; 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; } int n,a[maxn]; vector<int>v[maxn]; struct Flow { int N=5e4;int S,T,ct=1; int hhd[maxn],hd[maxn],to[maxn],nxt[maxn],dis[maxn]; double w[maxn]; void clear(){ memset(hhd,0,sizeof(hhd)); memset(hd,0,sizeof(hd)); memset(to,0,sizeof(to)); memset(nxt,0,sizeof(nxt)); memset(dis,0,sizeof(dis));ct=1; } void ins(int x,int y,double c){ if((!x)||(!y))return; //cout<<"? "<<x<<" "<<y<<" "<<c<<endl; ++ct;nxt[ct]=hd[x];hd[x]=ct;to[ct]=y,w[ct]=c; ++ct;nxt[ct]=hd[y];hd[y]=ct;to[ct]=x,w[ct]=0;//v[y].p_b(m_p(x,++ct)); }double dfs(int u,double fl){ if(u==T)return fl; double res=0;for(int &i=hd[u];i;i=nxt[i]){ if(w[i]>eps&&dis[to[i]]==dis[u]+1){ double val=dfs(to[i],min(fl,w[i])); w[i]-=val,w[i^1]+=val,res+=val,fl-=val; if(!fl)break; }}if(!res)dis[u]=-1; return res; }bool bfs(){ memset(dis,-1,sizeof(int)*(N+5)); memcpy(hd,hhd,sizeof(int)*(N+5)); dis[S]=0;queue<int>q;q.push(S); while(!q.empty()){ int x=q.front();q.pop(); for(int i=hd[x];i;i=nxt[i])if(w[i]>eps&&dis[to[i]]==-1){ dis[to[i]]=dis[x]+1,q.push(to[i]); } } return (dis[T]!=-1); } double dinic(){ memcpy(hhd,hd,sizeof(int)*(N+5)); double res=0;while(bfs())res+=dfs(S,1e16); //cout<<"? "<<res<<endl; return res; } }F; int id(int x,int y){return (x-1)*n+y;} bool chk(double x){ F.clear();double all=0; up(i,1,n)up(j,1,n)if(i!=j){ all+=a[i]*a[j]; F.ins(1,id(i,j)+2,a[i]*a[j]); F.ins(id(i,j)+2,id(i,i)+2,1e16); F.ins(id(i,j)+2,id(j,j)+2,1e16); }up(i,1,n)for(int x:v[i])F.ins(id(i,i)+2,id(x,x)+2,1e16); up(i,1,n)F.ins(id(i,i)+2,2,a[i]*a[i]*x); F.S=1,F.T=2; all-=F.dinic(); return (all>0); } void slv(){ n=read();int m=read(); up(i,1,n)a[i]=read(); while(m--){ int x=read(),y=read(); v[x].p_b(y); }double l=0,r=1e5; while(l+0.00000000001<r){ double mid=(l+r)/2; if(chk(mid))l=mid; else r=mid; }printf("%.10lf",l+1); }int main(){ //freopen("sale.in","r",stdin); //freopen("sale.out","w",stdout); slv(); //cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; fclose(stdin); fclose(stdout); return 0; }