版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/flyawayl/article/details/78267734
题意
Mishka想要去一个国家旅行,这个国家共有
注意:任何两个城市之间最多只有一条路。
思路
先考虑所有中心城市:每条路只能算一遍,那么我们可以得到如下公式:
其中,
最后再枚举环中的
注意:答案可能超出int,用long long
AC代码
#include <stdio.h>
#include <string.h>
typedef long long LL;
const int maxn = 100000+5;
int n, k;
int c[maxn], d[maxn];
bool cp[maxn];
int main() {
while(scanf("%d%d", &n, &k) == 2) {
memset(cp, 0, sizeof(cp));
LL sum = 0;
for(int i = 1; i <= n; i++) {
scanf("%d", &c[i]);
sum += c[i];
}
int id;
for(int i = 0; i < k; i++) {
scanf("%d", &d[i]);
cp[d[i]] = true;
}
//all capital cities
int tol = 0;
LL ans = 0;
for(int i = 0; i < k; i++) {
id = d[i];
tol += c[id];
ans += 1LL*c[id]*(sum-tol);
}
//the road bettwen two cities which aren't capital
if(!cp[1] && !cp[n]) ans += c[1]*c[n];
for(int i = 1; i < n; i++) {
if(!cp[i] && !cp[i+1]) ans += c[i]*c[i+1];
}
printf("%lld\n", ans);
}
return 0;
}
如有不当之处欢迎指出!