题目描述
先给定一个长度为n数列,再给定m个操作,现在需要维护五个操作:
1 x:在光标的前面插入一个数字x。
2:删除光标前的最后一个数字,如果光标前没有数字则忽略。
3:左移一格光标,如果光标已经在最左边则忽略。
4:右移一格光标,如果光标已经在最右边则忽略。
5 k:求前k个数的前缀和,保证k<=数列长度。
初始时光标在数列的最后一个数后面
输入格式
第一行一个正整数n表示数列长度。
第二行n个整数表示这个序列。
第三行一个正整数m表示操作数。
后面m行每行一个或两个数,参照【问题描述】。
输出格式
对于每个询问,输出一个答案,每个答案占一行
样例 #1
样例输入 #1
2
3 2
5
3
1 6
4
2
5 2
样例输出 #1
9
提示
数据范围:n,m,k<=100000,x<=int
思路
这道题不同于其他的地方的是,他的操作是在光标前,我们又知道,栈只能操纵栈顶(使用指针的方式除外),所以这个地方就要用两个栈来存储,具体的看我秀操作
ACcode
#include <bits/stdc++.h>
using namespace std;
long long cmp1,cmp2,a[200010],b[200010];
int cnt1,cnt2;
stack<int> q1,q2;
int main(){
int n,m;
cin>>n;
for (int i=0;i<n;i++){
cin>>cmp1;
q1.push(cmp1);
cnt1++;
a[cnt1]=a[cnt1-1]+cmp1;
}
//
cin>>m;
for (int i=0;i<m;i++){
cin>>cmp1;
if (cmp1==1){
cin>>cmp2;
q1.push(cmp2);
cnt1++;
a[cnt1]=a[cnt1-1]+cmp2;
}else if (cmp1==2&&cnt1>=1){
q1.pop();
cnt1--;
}else if (cmp1==3&&cnt1>=1){
q2.push(q1.top());
cnt2++;
b[cnt2]=b[cnt2-1]+q1.top();
//
cnt1--;
q1.pop();
}else if (cmp1==4&&cnt2>=1){
q1.push(q2.top());
cnt1++;
a[cnt1]=a[cnt1-1]+q2.top();
//
cnt2--;
q2.pop();
}else if (cmp1==5){
cin>>cmp2;
if (cmp2<=cnt1)cout<<a[cmp2]<<endl;
else {
cout<<a[cnt1]+b[cnt2]-b[cnt2-cmp2+cnt1]<<endl;
}
}
}
return 0;
}
感谢王大佬提供思路
看了这么久,作者也写了这么久,能不能点一个赞,在收藏一下呢?最好的话在点个关注吧
谢谢啦!