Editor
Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 628 Accepted Submission(s): 237
Problem Description
![](https://i-blog.csdnimg.cn/blog_migrate/b85340f291714255f8f4a743cb84930b.jpeg)
Sample Input
8 I 2 I -1 I 1 Q 3 L D R Q 2
Sample Output
2 3本题是个模拟题。我们只需动态模拟该题的过程即可。由于查询时是求从1到当前位置的起点为1的不间断的连续区间最大和,这就大大降低了题目的难度。sum[i]为到i的累加和,dp[i]为到i的起点为1的不间断的连续区间最大和,我们可知dp[i]=max(sum[i],dp[i-1]).题目光标的位置只能左右移动,插入、删除操作都是在光标左右两边进行的,可以联想堆栈这种数据结构。分别用两个堆栈维护光标左右两边,然后模拟过程。#include<iostream> #include<stack> #include<cstdio> #include<cstring> using namespace std; const int NINF=-100000000; const int MAXN=1000000+100; stack<int>Left,Right; int sum[MAXN]; int ans[MAXN]; inline int Max(int a,int b) { return a<b?b:a; } int main() { int n,num,tmp; char cmd[5]; while(~scanf("%d",&n)) { while(!Left.empty())Left.pop(); while(!Right.empty())Right.pop(); num=0; sum[num]=0; ans[num]=NINF; num++; while(n--) { scanf("%s",cmd); if(cmd[0]=='I') { scanf("%d",&tmp); Left.push(tmp); sum[num]=sum[num-1]+tmp; ans[num]=Max(ans[num-1],sum[num]); num++; } else if(cmd[0]=='D') { Left.pop(); num--; } else if(cmd[0]=='L') { if(!Left.empty()) { Right.push(Left.top()); Left.pop(); num--; } } else if(cmd[0]=='R') { if(!Right.empty()) { Left.push(Right.top()); Right.pop(); tmp=Left.top(); sum[num]=sum[num-1]+tmp; ans[num]=Max(ans[num-1],sum[num]); num++; } } else if(cmd[0]=='Q') { scanf("%d",&tmp); printf("%d\n",ans[tmp]); } } } return 0; }