codeforces - 703B - Mishka and trip(数学)

LINK:http://codeforces.com/contest/703/problem/B
题意:一个国家有n个城市,其中里面有k个省会,每个城市有点权。每个城市都和它前一个城市和后一个城市有边,第n个城市还有一条到第一个城市的边,省会到每个城市都有边。对每条边u-v边权都是c[u]*c[v]。求全部边圈和。
解法:n*n会t,给给。

sum是首府的权值和。对每个不是首府的点,它到所有首府的边权和是c[i]*sum。
扫一遍加起来。
然后处理首府之间的权。
在首府集中取一个点,别的首府到它的边权和就是(sum-c[i])*c[i];然后从首府集中去掉这个点。
然后再0(n)地找边的两点都不是首府的边,加起来就是答案

#include<bits/stdc++.h>
using namespace std;
#define ll __int64
int k, n;
int c[100010], id[100010];
bool vis[100010] = {false};

int main() {
    int a, j;
    cin >> n >> k;
    __int64 ans = 0, sum = 0;
    for(int i = 1; i <= n; i++) {
        cin >> c[i];
    }
    for(int i = 1; i <= k; i++) {
        cin >> a;
        id[i] = a;
        vis[a] = 1;
        sum += c[a];
    }
    for(int i = 1; i <= n; i++) {
        if(!vis[i])ans += sum * 1ll * c[i];
    }
    for(int i = 1; i <= k; i++) {
        sum -= c[id[i]];
        ans += sum * c[id[i]];
    }
    for(int i = 1; i < n; i++) {
        if(!vis[i] && !vis[i + 1])ans += c[i] * c[i + 1];
    }
    if(!vis[1] && !vis[n])ans += c[1] * c[n];
    cout << ans << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值