正题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699
大意
有5种操作
1.在光标处写入一个数字
2.在光标处删除一个数字
3.4.将光标往 左/右 移动
5.询问一个位置(光标前)之前的最大前缀和
解题思路
我们开两个栈,一个是存光标前,一个存在光标之后。
然后写入就压入第一个栈,删除就弹出一个栈,光标左移就将第一个栈顶放入第二个栈,右移就将第二个栈放回第一个栈,询问就用f数组记录答案,然后直接输出。
code
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<stack>
using namespace std;
stack<int> a,b;
int n,x,sum,f[1000010],tot;
char c;
int main()
{while(scanf("%d",&n)>0){tot=0;f[0]=-2147483647;sum=0;while(!a.empty()) a.pop();while(!b.empty()) b.pop();for(int i=1;i<=n;i++){cin>>c;if(c=='I')//写入{scanf("%d",&x);a.push(x);tot++;sum+=x;f[tot]=max(f[tot-1],sum);}else if(c=='D'&&!a.empty())//删除{sum-=a.top();a.pop();tot--;}else if(c=='L'&&!a.empty())//左移{b.push(a.top());sum-=a.top();a.pop();tot--;}else if(c=='R'&&!b.empty())//右移{a.push(b.top());tot++;sum+=b.top();f[tot]=max(f[tot-1],sum);b.pop();}else if(c=='Q')//询问{scanf("%d",&x);printf("%d\n",f[x]);}}}
}