功能强大编辑器
时间限制: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;
}