题意:有n个城市,普通城市会和下一个城市有一条连线,省会城市 会与其他所有城市都有一条边,边的权值是两个城市权值的乘积,求所有边的权值之和。
题解:直接现将省会城市的不相邻的权值算出来,然后在遍历一边就好了。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[100010],b[100010],mark[100010];
int main(){
int n,k;
ll sum = 0;
cin>>n>>k;
ll ans = 0;
for(int i = 1 ; i <= n ; i++){
scanf("%lld",&a[i]);
ans += a[i];
}
for(int i = 1 ; i <= k ; i++){
scanf("%lld",&b[i]);
}
for(int i = 2 ;i <= n ; i++){
sum+=a[i]*a[i-1];
}
sum+=a[n]*a[1];
for(int i = 1 ; i <= k ; i++){
mark[b[i]]=1;
ans-=a[b[i]];
ll mm = ans;
if(b[i]==1){
if(!mark[2]){
mm-=a[2];
}
if(!mark[n]){
mm-=a[n];
}
}else if(b[i]==n){
if(!mark[n-1]){
mm-=a[n-1];
}
if(!mark[1]){
mm-=a[1];
}
}else{
if(!mark[b[i]-1]){
mm-=a[b[i]-1];
}
if(!mark[b[i]+1]){
mm-=a[b[i]+1];
}
}
sum+=mm*a[b[i]];
}
cout<<sum<<endl;
}