2018-2019 ACM-ICPC, Asia East Continent Final L Eventual … Journey
#include<iostream> using namespace std; const int MAX=2e5+10; int cnt[MAX]; int ans[MAX]; int a[MAX]; int main() { int n,m,zero=0,one=0; cin>>n>>m; for(int i=1; i<=n; i++) { scanf("%d",&a[i]); if(a[i]==0)zero++; else one++; } while(m--) { int x,y; scanf("%d%d",&x,&y); if(a[x]!=a[y]) { cnt[x]++;//记录每个点的桥 cnt[y]++; } } int A=0,B=0; for(int i=1; i<=n; i++) { if(a[i]==0&&cnt[i])A++;//0类,而且有桥, if(a[i]==1&&cnt[i])B++;//1类,数量 } for(int i=1; i<=n; i++) { ans[i]+=cnt[i];//与异类相连的桥的数目,也就是步数 if(a[i]==0)ans[i]+=zero-1;//加同类 else ans[i]+=one-1;//同类 if(cnt[i]==0) {//如果 这个站没有建桥 if(a[i]==0) {//如果是0类 ans[i]+=2*B;//一个点只算建在上面的一座桥,其他为在一个点上重复建桥的 ans[i]+=3*(one-B);// } else { ans[i]+=2*A; ans[i]+=3*(zero-A); } } else {//如果这个点建桥了 if(a[i]==0)ans[i]+=2*(one-cnt[i]); //如果是0类, 那么到1类的其他点的距离就是2 else ans[i]+=2*(zero-cnt[i]); } } for(int i=1; i<=n; i++) cout<<ans[i]<<" "; return 0; }