题意就是一些城市,全部连起来,但是其中有些城市是首都,首都要和其他所有城市连接起来,每个城市有个美丽值,每条路的权值为所连接两个城市的美丽值的乘积。答案要求你求出所有路的权值总和。
首先先加首都的路,标记,然后再补其他路。
代码如下
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define LL long long
using namespace std;
int c[100010];
int n,k;
bool flag[100010];
LL sums = 0LL , sumc = 0LL;
LL ans = 0LL;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&c[i]);
sums += c[i];
}
for(int i=1,x;i<=k;i++){
scanf("%d",&x);
sumc += c[x];
flag[x] = true;
ans += c[x]*(sums-sumc);
}
for(int i=1;i<=n;i++){
if(flag[i] || flag[i+1]) continue;
ans += c[i]*c[i+1];
}
if(!flag[n] && !flag[1]) ans+=c[n]*c[1];
printf("%I64d\n",ans);
return 0;
}