简单题。
先把环上的贡献都计算好。然后再计算每一个$capital$ $city$额外做出的贡献值。
假设$A$城市为$capital$ $city$,那么$A$城市做出的额外贡献:$A$城市左边城市$L$和右边城市$R$都不能和$A$做出贡献,之前存在的$capital$ $city$和$A$城市不能做出贡献,要注意的是$L$和$R$中存在$capital$ $city$的情况。剩下的城市都可以和$A$做出贡献。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-8; void File() { freopen("D:\in.txt","r",stdin); freopen("D:\out.txt","w",stdout); } const int maxn=100010; int n,k; LL c[maxn],sum,y,p; bool f[maxn]; int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%lld",&c[i]); LL ans=0; c[n+1]=c[1]; for(int i=1;i<=n;i++) ans=ans+c[i]*c[i+1],y=y+c[i]; for(int i=1;i<=k;i++) { int x; scanf("%d",&x); sum=y; int L=x-1,R=x+1; if(L==0) L=n; if(R==n+1) R=1; sum=sum-c[L]-c[R]-c[x]; sum=sum-p; if(f[L]) sum=sum+c[L]; if(f[R]) sum=sum+c[R]; ans=ans+c[x]*sum; f[x]=1; p=p+c[x]; } printf("%lld ",ans); return 0; }