#include<bits/stdc++.h> #define reg register int #define il inline #define numb (ch^‘0‘) using namespace std; typedef long long ll; il void rd(int &x){ char ch;x=0;bool fl=false; while(!isdigit(ch=getchar()))(ch==‘-‘)&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x); } namespace Miracle{ const int N=100000+5; int n,m; int a[N]; struct node{ int nxt,to; }e[250000+5]; int hd[N],cnt; void add(int x,int y){ e[++cnt].nxt=hd[x]; e[cnt].to=y; hd[x]=cnt; } int du[N]; int b[250000+5][2]; ll ans=0; int vis[N]; int main(){ rd(n);rd(m); for(reg i=1;i<=n;++i) rd(a[i]); for(reg i=1;i<=m;++i){ rd(b[i][0]);rd(b[i][1]); ++du[b[i][0]];++du[b[i][1]]; } for(reg i=1;i<=m;++i){ int x=b[i][0],y=b[i][1]; if(du[x]<du[y]||(du[x]==du[y]&&x<y)) swap(x,y); add(x,y); } for(reg x=1;x<=n;++x){ for(reg i=hd[x];i;i=e[i].nxt){ int y=e[i].to; vis[y]=x; } for(reg i=hd[x];i;i=e[i].nxt){ int y=e[i].to; for(reg j=hd[y];j;j=e[j].nxt){ int z=e[j].to; if(vis[z]==x) ans+=max(max(a[x],a[y]),a[z]); } } } printf("%lld",ans); return 0; } } signed main(){ Miracle::main(); return 0; } /* Author: *Miracle* Date: 2019/3/6 14:12:52 */
bzoj5407 girls
大力容斥
原文:https://www.cnblogs.com/Miracevin/p/10483331.html