终于AC了。。
今天赛场上一直看这题,一直坚信用树状数组做,然后写了一发,一直TLE,没办法,确实没法优化。。只好放弃
赛后看解题报告,
栈A, B维护光标之前(之后)的序列
I x A.push(x)
D A.pop()
L B.push(A.pop())
R A.push(B.pop())
▶ 对于栈A 中的每个元素,额外维护前缀和,以及前缀和的
最大值
然后很信任的开了两个栈,写了好久,交一发,RE了!手动开栈WA了!肯定还有错,我发现只用栈是不可以的,因为题目问的是1-k之间找最大值,我的栈尾不一定就是第K个,唉~很傻逼的想要是栈可以直接取第k个元素就可以了,想到这,突然发现要取第k个元素,那么就用vector吧!vector 模拟栈。。
用vector写完了,然后交一发WA!!,天呀,不甘心,后面一直再检查,才发现那个光标位置出了一点错,改了一下A!!
代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <stack>
//#pragma comment(linker, "/STACK:10240000000,10240000000")//手动加桟---外挂
using namespace std;
const int M=1000005;
struct node
{
int v;
int sum;
int maxsum;
};
vector<node>A,B;
//stack<node>A,B;//之前的栈
int main()
{
int t,k,s;
char a[3];
while(scanf("%d",&t)!=EOF)
{
A.clear();
B.clear();
while(t--)
{
scanf("%s",a);
if(a[0]=='I')
{
scanf("%d",&s);
node next;
next.sum=s;
next.v=s;
next.maxsum=s;
if(A.size()>0)
{
node cur=A.back();
next.sum=cur.sum+next.v;
next.maxsum=max(cur.maxsum,next.sum);
A.push_back(next);
}
else
{
A.push_back(next);
}
}
else if(a[0]=='L')
{
if(A.size()>0)
{
node cur=A.back();
B.push_back(cur);
A.pop_back();
if(A.size()>0)//没判A空时就WA了
{
node vv= A.back();
A.pop_back();
vv.sum=cur.sum-cur.v;
vv.maxsum=max(vv.sum,vv.maxsum);
A.push_back(vv);
}
}
}
else if(a[0]=='R')
{
if(B.size()>0)
{
if(A.size()>0)
{
node cur=A.back();
node next=B.back();
//B.pop();
B.pop_back();
next.sum=cur.sum+next.v;
next.maxsum=max(cur.maxsum,next.sum);
A.push_back(next);
}
else
{
node next=B.back();
B.pop_back();
next.sum=next.v;
next.maxsum=next.v;
A.push_back(next);
}
}
}
else if(a[0]=='D')
{
if(A.size()>0)
{
node vv=A.back();
A.pop_back();
if(A.size())
{
node cur=A.back();
A.pop_back();
cur.sum=vv.sum-vv.v;
cur.maxsum=max(cur.maxsum,cur.sum);
A.push_back(cur);
}
}
}
else if(a[0]=='Q')
{
scanf("%d",&k);
printf("%d\n",A[k-1].maxsum);
}
}
}
return 0;
}