码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces 703B

时间:2016-08-06 00:15:16      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

题意:有n座城市,其中k座是省会城市,每个城市有对应的点权,城市1-2-3-...-n-1有一条路相连,省会城市与其他所有的城市相连,且每两个城市间最多有一条路,每条路的边权为路连接的两座城市的点权乘积,问所有路的边权和。

思路:预处理出所有城市的点权和与所有省会城市的点权和,对于每座城市,如果它不是省会城市的话,它只与它的前一个城市与后一个城市以及所有的省会城市有连边,如果它是省会城市的话,它与除了自己的所有城市有连边。这样每条边在边的两个点处都考虑了一次,答案/2。

 

#include<cstdio>
int val[100005];
int cab[100005];
typedef long long ll;
int main() {
    int n,k,x;
    ll city_sum=0,cab_sum=0;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++) {
        scanf("%d",&val[i]);
        city_sum+=val[i];
    }
    for(int i=1;i<=k;i++) {
        scanf("%d",&x);
        cab[x]=1;
        cab_sum+=val[x];
    }
    ll res=0;
    for(int i=1;i<=n;i++) {
        if(cab[i]) {
            res+=(city_sum-val[i])*val[i];
        }
        else {
            ll temp=cab_sum;
            if(i==1) {
                if(!cab[n]) temp+=val[n];
                if(!cab[2]) temp+=val[2];
            }
            else if(i==n) {
                if(!cab[n-1]) temp+=val[n-1];
                if(!cab[1]) temp+=val[1];
            }
            else {
                if(!cab[i-1]) temp+=val[i-1];
                if(!cab[i+1])temp+=val[i+1];
            }
            res+=temp*val[i];
        }
    }
    printf("%I64d\n",res/2);
    return 0;
}

 

codeforces 703B

标签:

原文地址:http://www.cnblogs.com/LinesYao/p/5742962.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!