【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;
}
原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998745.html