Editor(两种思路)

发布于:2022-07-27 ⋅ 阅读:(314) ⋅ 点赞:(0)

Editor
在这里插入图片描述

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;
}

网站公告

今日签到

点亮在社区的每一天
去签到