【简要题意】
有五种操作大致是
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是一道单纯的模拟题,灰常简单,就不另附文章避免缀余了。