HDU - 4699 对顶栈

Posted The Azure Arbitrator

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 4699 对顶栈相关的知识,希望对你有一定的参考价值。

Get到了全新O(1)替代部分伸展树功能的姿势
左栈stk1维护当前信息,右栈stk2维护历史删除信息
题目求的是严格的前缀和(且小于当前指针)那就每次左栈新增时再更新前缀和信息就好
即使把题面换成最大子段和也是一样搞法
要是O(1)求1到k的最大/小值?再来多一个维护历史的栈..应该可以吧

/*H E A D*/
stack<int> stk1,stk2;
ll sum[maxn],maxsum[maxn];
int main(){
    int Q,op,x,k;
    char str[50];
    while(~iin(Q)){
        while(!stk1.empty())stk1.pop();
        while(!stk2.empty())stk2.pop();
        memset(sum,0,sizeof sum);
        memset(maxsum,0x80,sizeof maxsum);
        rep(i,1,Q){
            s0(str);
            if(str[0]==‘I‘){
                x=read();
                stk1.push(x);
                int size=stk1.size();
                sum[size]=sum[size-1]+x;
                maxsum[size]=max(sum[size],maxsum[size-1]);
            }else if(str[0]==‘D‘){
                stk1.pop();
            }else if(str[0]==‘L‘){
                if(stk1.empty())continue;
                int t=stk1.top();
                stk2.push(t);
                stk1.pop();
            }else if(str[0]==‘R‘){
                if(stk2.empty())continue;
                int t=stk2.top();
                stk1.push(t);
                stk2.pop();
                int size=stk1.size();
                sum[size]=sum[size-1]+t;
                maxsum[size]=max(sum[size],maxsum[size-1]);
            }else{
                k=read();
                println(maxsum[k]);
            }
        }
    }
    return 0;
}

以上是关于HDU - 4699 对顶栈的主要内容,如果未能解决你的问题,请参考以下文章

HDOJ4699(对顶栈)

HDOJ 4699 Editor 对顶栈

栈专题练习

AcWing 128. 编辑器 模拟栈+对顶栈

对顶栈

20.6.7 周赛 设计浏览器历史记录 中等 5430(对顶栈)