1. 程式人生 > 實用技巧 >AcWing 128 編輯器(對頂棧)

AcWing 128 編輯器(對頂棧)

題目連結

解題思路

  對頂棧的模板題。L和R的操作可以由對頂棧來實現,至於查詢操作用一個字首和陣列和一個存最大值的陣列來存就行了。

程式碼

const int maxn = 1e6+10;
stack<int> skl, skr;
int pre[maxn], f[maxn] = {-114514}, k;
int main() {
    int q; scanf("%d",&q);
    while(q--) {
        char ch[2]; int num; scanf("%s",ch);
        if (ch[0]=='I') {
            scanf("%d",&num);
            ++k;
            pre[k] = pre[k-1]+num;
            f[k] = max(f[k-1],pre[k]);
            skl.push(num);
        } 
        else if (ch[0]=='D') {
            if (!skl.empty()) {
                --k; skl.pop();
            }
        }
        else if (ch[0]=='L') {
            if (!skl.empty()) {
                --k;
                skr.push(skl.top());
                skl.pop();
            }
        }
        else if (ch[0]=='R') {
            if (!skr.empty()) {
                ++k;
                pre[k] = pre[k-1]+skr.top();
                f[k] = max(f[k-1],pre[k]);
                skl.push(skr.top());
                skr.pop();
            }
        }
        else if (ch[0]=='Q') {
            scanf("%d",&num);
            printf("%d\n",f[num]);
        }
    }
    return 0;
}