首页 > 代码库 > CodeForces 703B Mishka and trip

CodeForces 703B Mishka and trip

简单题。

先把环上的贡献都计算好。然后再计算每一个$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\n",ans);    return 0;}

 

CodeForces 703B Mishka and trip