题目大意:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699
一个打字机有5种功能:
- :在光标后面插入这个元素
- :将光标右移
- :将光标左移
- :输出前个数字的连续最大和
- :删除光标的前一个数字
思路:
模拟栈。开两个栈和,光标左边的数字放在栈,光标右边的数字放在栈。
对于每一个操作:
- :在中插入一个元素,并且求出的前缀和以及的答案。易得方程
- :将栈的栈顶元素弹出并放入栈中,同时像操作一样求出和
- :将栈的栈顶元素弹出并放入栈中,和清零
- :直接输出
- :将栈栈顶元素弹出,和清零
本题由多组测试数据!
代码:
#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;
}