牛客 Editor

https://ac.nowcoder.com/acm/contest/1005/A
翻译见liyudong的蓝皮书

分析

对顶栈
维护两个栈,一个记录开始到光标,另一个则记录光标到结束
每个操作均可\(O(1)\)解决
注意:光标不能越出

#include<bits/stdc++.h>
using namespace std;

const int N=1e6+5;
int n1,n2,s1[N],s2[N],ans[N],s[N];
char st[10];
int main() {
	int T; scanf("%d",&T);
	n1=n2=0;
	while(T--) {
		scanf("%s",st);
		if(st[0]=='L') {
			if(n1) n2++,s2[n2]=s1[n1],n1--;
		}
		if(st[0]=='R') {
			if(n2) {
				n1++,s1[n1]=s2[n2],n2--;
				s[n1]=s[n1-1]+s1[n1];
				if(n1>1) ans[n1]=max(ans[n1-1],s[n1]);
					else ans[n1]=s[n1];
			}
		} 
		if(st[0]=='I') {
			int x; scanf("%d",&x);
			s1[++n1]=x;
			s[n1]=s[n1-1]+s1[n1];
			if(n1>1) ans[n1]=max(ans[n1-1],s[n1]);
				else ans[n1]=s[n1];
		}
		if(st[0]=='D') {
			if(n1) n1--;
		} 
		if(st[0]=='Q') {
			int x; scanf("%d",&x);
			printf("%d\n",ans[x]);
		}
	}
	return 0;
}
posted @ 2020-11-26 20:14  wwwsfff  阅读(104)  评论(0)    收藏  举报