记录编号 |
459900 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[福州培训2010] 最大和 |
最终得分 |
100 |
用户昵称 |
699 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.079 s |
提交时间 |
2017-10-16 09:25:58 |
内存使用 |
1.83 MiB |
显示代码纯文本
//环线上的最大和
//699
#include <cstdio>
#include <deque>
using namespace std;
const int nmax=200010;
int N;
int ans;
int res[nmax]={0};
int pre[nmax]={0};
class poi{
public:
int val,pos;
};
deque<poi> d;
void PreDo(){
ans=0;
scanf("%d",&N);
for(int i=1;i<=N;i++){
scanf("%d",&res[i]);
res[i+N]=res[i];
}
for(int i=1;i<=N+N;i++){
pre[i]=pre[i-1]+res[i];
}
/*
for(int i=1;i<=N+N;i++){
printf("%d %d\n",i,pre[i]);
}
printf("\n");
*/
}
void Cal(){
d.push_back((poi){pre[0],0});
for(int i=1;i<=N+N;i++){
poi bb=d.back();
poi ff=d.front();
while(!d.empty()&&bb.val>pre[i-1]){
d.pop_back();
if(!d.empty()){
bb=d.back();
}
}
while(!d.empty()&&ff.pos<i-N){
d.pop_front();
if(!d.empty()){
ff=d.front();
}
}
d.push_back((poi){pre[i-1],i-1});
ff=d.front();
// printf("ff:%d %d\n",ff.val,ff.pos);
ans=max(ans,pre[i]-ff.val);
}
printf("%d\n",ans);
}
int main(){
freopen("maxsum.in","r",stdin);
freopen("maxsum.out","w",stdout);
PreDo();
Cal();
return 0;
}