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;
}

猜你喜欢

转载自www.cnblogs.com/QingyuYYYYY/p/12001477.html