【HDU 4699】Editor【栈】

题目大意:

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

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

思路:

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

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


    代码:

    #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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值