时间限制:1秒 内存限制:128M
题目描述
你要帮助小可创造一个超级数字编辑器!编辑器依旧运行在Linux下,因此你只能通过指令去操控他。指令有五种:
In X
表示在光标左侧插入一个数字
Del
表示删除光标左侧一个数字
Left
表示光标向左移动一下
Right
表示光标向右移动一下
Ask k
表示光标之前的序列为a_1,a_2,a_3a1,a2,a3…a_kak,输出max_{1\leq i \leq k}S_imax1≤i≤kSi,其中S_i=a_1+a_2+..+a_iSi=a1+a2+..+ai
输入描述
输入第一行包含一个整数Q,表示指令数量。
然后输入Q行,表示Q个指令。
输出描述
对于每个Ask k
均输出一行,表示询问结果。
输入样例
8
In 2
In -1
In 1
Ask 3
Left
Del
Right
Ask 2
输出样例
2
3
数据范围
50%的数据,Q不超过1000.
100%的数据,Q不超过1000000,且x不超过1000
参考代码如下
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=1e6+5;
stack<int> a,b;
int n,x,sum[N],mx[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
memset(mx,-0x3f,sizeof mx);
while(n--){
string s;
cin>>s;
if(s=="In"){
cin>>x;
a.push(x);
int t=a.size();
sum[t]=sum[t-1]+x;
mx[t]=max(mx[t-1],sum[t]);
}
if(s=="Del"&&!a.empty()) a.pop();
if(s=="Left"&&!a.empty()){
b.push(a.top());
a.pop();
}
if(s=="Right"&&!b.empty()){
x=b.top();
a.push(x);
b.pop();
int t=a.size();
sum[t]=sum[t-1]+x;
mx[t]=max(mx[t-1],sum[t]);
}
if(s=="Ask"){
cin>>x;
cout<<mx[x]<<endl;
}
}
return 0;
}