【HDU 4699】Editor【栈】

题目大意:

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

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

思路:

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

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

猜你喜欢

转载自blog.csdn.net/SSL_ZYC/article/details/81698144