Acwing128. 编辑器

题目链接:128. 编辑器 - AcWing题库

标签:堆顶栈

思路:分别用两个栈,记录光标左边的数和光标右边的数;用s记录前缀和,f记录最大前缀。

对题目所示五个操作有:

1.插入操作:将x插入到L栈中。

2.删除操作:删除L栈的顶部元素。

3.光标左移:将L栈的顶部元素push到R栈

4.光标右移:将R栈的顶部元素push到L栈

5.查询操作:输出f[k]

对于前k个数的最大前缀,可能等于前k-1个数的最大前缀 或者 前k个数的和

即:f[k]=max(f[k-1],s[k])

注意:注意空栈!

代码:

#include
#include
#include
using namespace std;

const int N = 1000010;

int n,x;
char op;
int s[N],f[N];
int l[N],r[N],len1,len2;

int main()
{
    memset(f,-0X3f,sizeof f);
    
    cin>>n;
    for(int i=1;i<=n;i++) 
    {
        cin>>op;
        if(op=='I')
        {
            cin>>x;
            l[++len1]=x;
            s[len1]=s[len1-1]+x;
            f[len1]=max(f[len1-1],s[len1]);
        }
        else if(op=='D')
        {
            if(len1>0) len1--;
        }
        else if(op=='L')
        {
            if(len1>0)
            {
                x = l[len1];
                len1--;
                r[++len2]=x;
            }
        }
        else if(op=='R')
        {
            if(len2>0)
            {
                x = r[len2];
                len2--;
                l[++len1]=x;
                s[len1]=s[len1-1]+x;
                f[len1]=max(f[len1-1],s[len1]);
            }
        }
        else if(op=='Q')
        {
            cin>>x;
            cout<

你可能感兴趣的:(算法)