1.用STL的栈(由于是一个栈,无法实现 O ( 1 ) O(1) O(1)处理询问,无情TLE):
- 注意光标范围,不能使数组越界
- scanf注意不能吞入回车,用scanf(" %c",&c);处理
#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<b;i++)
using namespace std;
vector<int> v;
int max_(int t){
int res=v[0],sum=v[0];
fo(i,1,t){
sum+=v[i];
if(res<sum)res=sum;
}
return res;
}
int main(){
int n,t;
char c;
while(cin>>n){
while(!v.empty())v.pop_back();
int cur=0;
while(n--){
scanf(" %c",&c);
if(c=='I'){
scanf("%d",&t);
v.insert(v.begin()+cur,t);
cur++;
}
else if(c=='D' && cur>0){
v.erase(v.begin()+cur-1);
cur--;
}
else if(c=='L' && cur>0)cur--;
else if(c=='R' && cur<v.size())cur++;
else{
scanf("%d",&t);
printf("%d\n",max_(min(cur,t)));
}
}
}
return 0;
}
2.手写对顶栈,实现 O ( 1 ) O(1) O(1)处理询问(成功AC):
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000006, INF = 0x3f3f3f3f;
int q, st1[N], st2[N], s[N], f[N];
void Editor() {
int t1 = 0, t2 = 0;
while (q--) {
char c[2];
scanf("%s", c);
switch (c[0]) {
case 'I':
scanf("%d", &st1[++t1]);
s[t1] = s[t1-1] + st1[t1];
f[t1] = max(f[t1-1], s[t1]);
continue;
case 'D':
if (t1) t1--;
continue;
case 'L':
if (t1) st2[++t2] = st1[t1--];
continue;
case 'R':
if (!t2) continue;
st1[++t1] = st2[t2--];
s[t1] = s[t1-1] + st1[t1];
f[t1] = max(f[t1-1], s[t1]);
continue;
case 'Q':
int k;
scanf("%d", &k);
printf("%d\n", f[min(k,t1)]);
}
}
}
int main() {
s[0] = 0;
f[0] = -INF;
while (cin >> q) Editor();
return 0;
}