题目大意:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699
一个打字机有5种功能:
- I I :在光标后面插入 x x 这个元素
- :将光标右移
- L L :将光标左移
- x x :输出前个数字的连续最大和
- D D :删除光标的前一个数字
思路:
模拟栈。开两个栈和
b
b
,光标左边的数字放在栈,光标右边的数字放在
b
b
栈。
对于每一个操作:
-
x
x
:在中插入一个元素
x
x
,并且求出的前缀和以及
Q
Q
的答案。易得方程
- R R :将栈的栈顶元素弹出并放入 a a 栈中,同时像操作一样求出 sum[i] s u m [ i ] 和 f[i] f [ i ]
- L L :将栈的栈顶元素弹出并放入 b b 栈中,和 f[i] f [ i ] 清零
- Q Q :直接输出 f[x] f [ x ]
- D D :将栈栈顶元素弹出, sum[i] s u m [ i ] 和 f[i] f [ i ] 清零
本题由多组测试数据!
代码:
#include <cstdio> #include <stack> #include <iostream> #include <cstring> #define Inf 1e8 using namespace std; int n,x,k[1000001],f[1000001],m,sum[1000001]; char c; stack<int> a; stack<int> b; int main() { while (scanf("%d",&n)==1) { while (a.size()) a.pop(); while (b.size()) b.pop(); f[0]=-Inf; sum[0]=0; m=0; //初始化 for (int j=1;j<=n;j++) { cin>>c; if (c=='I') { m++; scanf("%d",&k[m]); a.push(k[m]); sum[m]=sum[m-1]+k[m]; f[m]=max(f[m-1],sum[m]); }else if (c=='R') { if (b.size()) { m++; x=b.top(); a.push(x); b.pop(); sum[m]=sum[m-1]+x; f[m]=max(f[m-1],sum[m]); } }else if (c=='L') { if (a.size()) { sum[m]=f[m]=0; m--; x=a.top(); b.push(x); a.pop(); } }else if (c=='Q') { scanf("%d",&x); printf("%d\n",f[x]); }else if (c=='D') { if (a.size()) { a.pop(); sum[m]=f[m]=0; m--; } } } } return 0; }