• 【HDU 4699】Editor【栈】


    题目大意:

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699
    一个打字机有5种功能:

    • I x:在光标后面插入x这个元素
    • R:将光标右移
    • L:将光标左移
    • Q x:输出前x个数字的连续最大和
    • D:删除光标的前一个数字

    思路:

    模拟栈。开两个栈ab,光标左边的数字放在a栈,光标右边的数字放在b栈。
    对于每一个操作:

    1. I x:在a中插入一个元素x,并且求出a的前缀和以及Q的答案。易得方程
      f[i]=max(f[i1],sum[i])
    2. R:将b栈的栈顶元素弹出并放入a栈中,同时像I操作一样求出sum[i]f[i]
    3. L:将a栈的栈顶元素弹出并放入b栈中,sum[i]f[i]清零
    4. Q x:直接输出f[x]
    5. D:将a栈栈顶元素弹出,sum[i]f[i]清零

    本题由多组测试数据!


    代码:

    #include <cstdio>
    #include <stack>
    #include <iostream>
    #include <cstring>
    #define Inf 1e8
    using namespace std;
    
    int n,x,k[1000001],f[1000001],m,sum[1000001];
    char c;
    stack<int> a;
    stack<int> b;
    
    int main()
    {
        while (scanf("%d",&n)==1)
        {
            while (a.size()) a.pop();
            while (b.size()) b.pop();
            f[0]=-Inf;
            sum[0]=0;
            m=0;  //初始化
            for (int j=1;j<=n;j++)
            {
                cin>>c;
                if (c=='I')
                {
                    m++;
                    scanf("%d",&k[m]);
                    a.push(k[m]);
                    sum[m]=sum[m-1]+k[m];
                    f[m]=max(f[m-1],sum[m]);
                }else
                if (c=='R')
                {
                    if (b.size()) 
                    {
                        m++;
                        x=b.top();
                        a.push(x);
                        b.pop();
                        sum[m]=sum[m-1]+x;
                        f[m]=max(f[m-1],sum[m]);
                    }   
                }else
                if (c=='L')
                {
                    if (a.size()) 
                    {
                        sum[m]=f[m]=0;
                        m--;
                        x=a.top();
                        b.push(x);
                        a.pop();
                    }
                }else
                if (c=='Q')
                {
                    scanf("%d",&x);
                    printf("%d\n",f[x]);
                }else
                if (c=='D')
                {
                    if (a.size())
                    {
                        a.pop();
                        sum[m]=f[m]=0;
                        m--;
                    } 
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    写在最前面
    Bzoj 2281 [Sdoi2011]黑白棋 题解
    bzoj3125: CITY 题解
    CDQZ 集训大总结
    CDQZ集训DAY10 日记
    CDQZ集训DAY9 日记
    CDQZ集训DAY7 日记
    CDQZ集训DAY6 日记
    CDQZ集训DAY5 日记
    CDQZ集训DAY4 日记
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998743.html
Copyright © 2020-2023  润新知