#include <cstdio>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
ll n, k, a[100005], b[100005], sum, tsum, res;
int main()
{
cin >> n >> k;
sum = 0;
for (ll i = 0; i < n; i++) {
scanf("%I64d", &a[i]);
sum += a[i];
}
for (ll i = 0; i < k; i++) {
scanf("%I64d", &b[i]);
}
map<ll, ll> mp; //标记之前算过的首都,避免重复计算
res = 0; tsum = 0; //tsum用于去重
//先算所有与首都相连的路
for (ll i = 0; i < k; i++) {
res = res + (sum - a[b[i] - 1] - tsum) * a[b[i] - 1];
mp[b[i] - 1] = 1;
tsum += a[b[i] - 1];
}
//算非首都之间的路
a[n] = a[0];
for (ll i = 1; i <= n; i++) {
if (!mp[i % n]) {
if (!mp[i - 1]) {
res += a[i - 1] * a[i];
}
}
}
cout << res << endl;
return 0;
}
Mishka与旅行路线

Mishka计划访问一个由n个城市组成的国家,其中有k个首都城市。每个城市都有一个独特的美丽值,首都城市间及与其他城市直接相连。任务是计算每条路线的价格,即两个连接城市美丽值的乘积之和。


510

被折叠的 条评论
为什么被折叠?



