Description
Solution
刚开始看到题目,好难啊,不可做。然后打算弃疗打暴力,直接用链表进行储存,暴力求出答案,调了一个小时。然后突然注意到保证1≤k≤N,N为当前光标前的数字个数。一下子就开心至极,用一个数组存储就好了,只有当插入和右移时需要修改,而且
O(1)
就能完成,然后只用了两分钟就改好了,满心欢喜以为能A,结果链表打炸了。
之后向ducky请教,发现问题根本没有那么复杂,直接用两个栈,表示光标前的数和光标后的数,每次操作就是对于栈顶的操作,而答案的处理和链表的差不多。
不足之处
- 不要随便祭出链表,一个不慎就会指到域值以外,导致报错。
- 打链表要尝试各种数据,最好是能手出一些特殊数据。
- 每次新建一个节点后,都要把暂时不用的域赋成nil,不然会指到一个莫名的域
- 每次剔除一个节点时要记得dispose掉,不然会白白占用空间(OJ上8字节啊!!!)
Code
var
s,ans,a,b:array[0..1000000] of longint;
q,i,x:longint;
ch:char;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;
begin
ans[0]:=-maxlongint;
readln(q);
for i:=1 to q do
begin
read(ch);
case ch of
'I':
begin
read(ch); read(x);
inc(a[0]); a[a[0]]:=x;
s[a[0]]:=s[a[0]-1]+a[a[0]];
ans[a[0]]:=max(ans[a[0]-1],s[a[0]]);
end;
'L':
if a[0]>0 then
begin
inc(b[0]); b[b[0]]:=a[a[0]];
dec(a[0]);
end;
'D':dec(a[0]);
'R':
if b[0]>0 then
begin
inc(a[0]);a[a[0]]:=b[b[0]];
dec(b[0]);
s[a[0]]:=s[a[0]-1]+a[a[0]];
ans[a[0]]:=max(ans[a[0]-1],s[a[0]]);
end;
'Q':
begin
read(ch); read(x);
writeln(ans[x]);
end;
end;
readln;
end;
end.