時間限制:1秒????????內存限制:128M
題目描述
你要幫助小可創造一個超級數字編輯器!編輯器依舊運行在Linux下,因此你只能通過指令去操控他。指令有五種:
In X
?表示在光標左側插入一個數字
Del
?表示刪除光標左側一個數字
Left
?表示光標向左移動一下
Right
?表示光標向右移動一下
Ask k
?表示光標之前的序列為a_1,a_2,a_3a?1??,a?2??,a?3??…a_ka?k??,輸出max_{1\leq i \leq k}S_imax?1≤i≤k??S?i??,其中S_i=a_1+a_2+..+a_iS?i??=a?1??+a?2??+..+a?i??
輸入描述
輸入第一行包含一個整數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;
}