首页 > 其他 > 详细

HDU - 4699 对顶栈

时间:2018-02-02 22:36:31      阅读:230      评论:0      收藏:0      [点我收藏+]

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 对顶栈

原文:https://www.cnblogs.com/caturra/p/8407260.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!