码迷,mamicode.com
首页 > 其他好文 > 详细

HDU - 4699 对顶栈

时间:2018-02-02 23:14:28      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:历史   一个   int   tin   最大   log   指针   tac   ==   

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

标签:历史   一个   int   tin   最大   log   指针   tac   ==   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!