记录编号 459900 评测结果 AAAAAAAAAA
题目名称 [福州培训2010] 最大和 最终得分 100
用户昵称 Gravatar699 是否通过 通过
代码语言 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;
}