題意就是一些城市,全部連起來,但是其中有些城市是首都,首都要和其他所有城市連接起來,每個城市有個美麗值,每條路的權值爲所連接兩個城市的美麗值的乘積。答案要求你求出所有路的權值總和。
首先先加首都的路,標記,然後再補其他路。
代碼如下
#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;
}