应该用sum统计所有城市的魅力值之和sum=a[1]+a[2]+。。。。+a[n]
每个首都的值就是(sum-自身魅力值-临近城市魅力值-之前计算过与自身相连的首都的魅力值)*a[t]
需要注意邻近城市也是首都的情况
下面是代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>
#include <set>
#include <cstdlib>
using namespace std;
long long save[100005];
long long possible[100005];
long long n,k;
long long cmp,sum;
long long capital[100005];
void getsum(long long t,long long &result){
long long r=0,l=0;
if(possible[t+1]==false){
if(t+1>n&&possible[1]==false){
r=save[1];
}else if(possible[t+1]==false){
r=save[t+1];
}
}
if(possible[t-1]==false){
if(t-1<1&&possible[n]==false){
l=save[n];
}else if(possible[t-1]==false){
l=save[t-1];
}
}
result += (sum-save[t]-cmp-r-l)*save[t];
cmp += save[t];
}
int main(){
memset(possible, false, sizeof(possible));
long long i;
scanf("%I64d%I64d",&n,&k);
long long result=0;
save[0]=0;
sum=0;
for(i=1;i<=n;i++){
scanf("%I64d",&save[i]);
sum+=save[i];
result += save[i]*save[i-1];
}
result += save[1]*save[n];
cmp=0;
for(i=1;i<=k;i++){
scanf("%I64d",&capital[i]);
possible[capital[i]]=true;
getsum(capital[i], result);
}
printf("%I64d\n",result);
return 0;
}