【NOIP提高组】数列编辑器

2 篇文章 0 订阅

Description

这里写图片描述

Solution

刚开始看到题目,好难啊,不可做。然后打算弃疗打暴力,直接用链表进行储存,暴力求出答案,调了一个小时。然后突然注意到保证1≤k≤N,N为当前光标前的数字个数。一下子就开心至极,用一个数组存储就好了,只有当插入和右移时需要修改,而且 O(1) 就能完成,然后只用了两分钟就改好了,满心欢喜以为能A,结果链表打炸了。
之后向ducky请教,发现问题根本没有那么复杂,直接用两个栈,表示光标前的数和光标后的数,每次操作就是对于栈顶的操作,而答案的处理和链表的差不多。
不足之处

  1. 不要随便祭出链表,一个不慎就会指到域值以外,导致报错。
  2. 打链表要尝试各种数据,最好是能手出一些特殊数据。
  3. 每次新建一个节点后,都要把暂时不用的域赋成nil,不然会指到一个莫名的域
  4. 每次剔除一个节点时要记得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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值