数列编辑器 editor.cpp

版权声明:写得不好,随便转载,但请注明出处,感激不尽 https://blog.csdn.net/xyc1719/article/details/83541139

【简要题意】
有五种操作大致是

1、在光标前插入一个数
2、在光标前删除一个数
3、光标左移
4、光标右移
5、询问从1到k的最大前缀和,保证k个元素在光标前

操作数小于等于1e6

【分析】
此题如果直接模拟,就可以获得80分的好成绩。但是如果再采用延迟更新,也就是向左移和删除时不更新,向右和插入时把元素塞入一个栈中,并对栈进行一顿操作。询问时只要询问栈前k个前缀和中的最大值就可以了,这也是可以O(1)完成。
但其实我们不难发现这样做的编程起来有所繁琐,在这里我们完全可以用两个栈来完成上述操作,注意栈为空时,不能再弹出。
我在这里的主要问题在于审题不清,把前缀和理解成了区间和,由于复杂度不变还做得津津有味,然后果断滚粗。。。

【code】

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1000010;
int s1[N],s2[N];
int ans[N],S[N];
int top1,top2,n;
int main()
{
    scanf("%d",&n);
    ans[0]=-(1<<30);
    for(int i=1;i<=n;i++)
    {
        char fl[10];cin>>fl;
        if(fl[0]=='I')
        {
            int x;scanf("%d",&x);
            s1[++top1]=x;
            S[top1]=S[top1-1]+x;
            ans[top1]=max(ans[top1-1],S[top1]);
        }
        if(fl[0]=='D') top1--;
        if(fl[0]=='L') if(top1>0)s2[++top2]=s1[top1--];
        if(fl[0]=='R'&&top2>0)
        {
            int x=s2[top2--];
            s1[++top1]=x;
            S[top1]=S[top1-1]+x;
            ans[top1]=max(ans[top1-1],S[top1]);
        }
        if(fl[0]=='Q')
        {
            int x;scanf("%d",&x);
            printf("%d\n",ans[x]);
        }
    }
    return 0;
}

另外今天的T4是一道单纯的模拟题,灰常简单,就不另附文章避免缀余了。

猜你喜欢

转载自blog.csdn.net/xyc1719/article/details/83541139