HDOJ4699 对顶栈

题目参考

小蓝p50

对顶栈/堆用于在序列中间某个指定位置进行修改

#include <iostream>
#include <stack>
#include<algorithm>
#include <cstring>

using namespace std;
const int f=-0x3f3f3f3f;
stack<int> s1,s2;
int dp[100000];//dp是最大前缀和
int sum[100000];//sum是前缀和
//用前缀和去维护最大前缀和(dp)
int pos=0;//这是光标所在的位置
int main() {
    int t;
    cin>>t;
    memset(dp, f, sizeof(dp));
    memset(sum, 0, sizeof(sum));
    while(t--) {

        char c;
        cin >> c;
        if (c == 'I') {
            int a;
            cin >> a;
            s1.push(a);
            pos++;//这步必须在这里,要不sum溢出
            sum[pos]=sum[pos-1]+a;
            dp[pos]=max(dp[pos-1],sum[pos]);

//            cout<<"sum["<<pos<<"] "<<sum[pos]<<endl;
//            cout<<"dp[pos] "<<dp[pos];
        }
        else if(c=='D'){
            if(s1.empty())continue;//注意

            s1.pop();
            pos--;
        }
        else if(c=='L'){
            if(s1.empty())continue;//注意

            int q=s1.top();
            s1.pop();
            s2.push(q);
            pos--;
        }
        else if(c=='R'){
            if(s2.empty())continue;//注意

            int q=s2.top();
            s2.pop();
            s1.push(q);
            pos++;
            sum[pos]=sum[pos-1]+q;
            dp[pos]=max(dp[pos-1],sum[pos]);
        }
        else{
            int r;
            cin>>r;
            cout<<dp[r]<<endl;
        }


    }
}
posted @ 2021-01-25 15:00  安之若醇  阅读(70)  评论(0编辑  收藏  举报
Live2D服务支持