• codeforces 703B


    题意:有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
    ",res/2);
        return 0;
    }
  • 相关阅读:
    写在寒假
    Docker安装Redis(两种方式)
    JVM类加载机制
    RabbitMQ学习
    MySQL索引详解
    Java内存区域
    Window10下的Docker Desktop安装(保姆级教程)
    JVM垃圾回收
    力扣Hot100(目前进度89/100)
    C# 发送邮件实例
  • 原文地址:https://www.cnblogs.com/LinesYao/p/5742962.html
Copyright © 2020-2023  润新知