CodeForces 703B Mishka and trip
2016-08-26 09:33
330 查看
简单题。
先把环上的贡献都计算好。然后再计算每一个$capital$ $city$额外做出的贡献值。
假设$A$城市为$capital$ $city$,那么$A$城市做出的额外贡献:$A$城市左边城市$L$和右边城市$R$都不能和$A$做出贡献,之前存在的$capital$ $city$和$A$城市不能做出贡献,要注意的是$L$和$R$中存在$capital$ $city$的情况。剩下的城市都可以和$A$做出贡献。
先把环上的贡献都计算好。然后再计算每一个$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; }
相关文章推荐
- MySQL EXPLAIN 命令详解
- 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用
- 3D引擎概述
- 微信公众平台设置的URL和token
- 模仿手机淘宝客户端新增地址中的地区选择
- git版本控制 学习之路(一)
- 手机验证码发送(ThinkPHP)
- 判断点是否在多边型内
- 文件分割
- 集成电路883和883b有什么区别
- 蓝鸥Unity开发基础——方法重载
- 集成电路883和883b有什么区别
- 集成电路883和883b有什么区别
- 腾讯编程
- 集成电路883和883b有什么区别
- js 禁止 复制,粘贴代码
- LeetCode: Top K Frequent Elements
- maven下载到配置到检测
- RNN 调参经验
- 版本更新