• [NOI2003]文本编辑器


    Splay裸题。考前提升下代码能力。速度进了Tyvj的Rank5……

    测试数据 #1: Accepted, time=374ms, mem=37870KB, score=10
    测试数据 #2: Accepted, time=0ms, mem=37874KB, score=10
    测试数据 #3: Accepted, time=46ms, mem=37870KB, score=10
    测试数据 #4: Accepted, time=109ms, mem=37870KB, score=10
    测试数据 #5: Accepted, time=109ms, mem=37874KB, score=10
    测试数据 #6: Accepted, time=46ms, mem=37866KB, score=10
    测试数据 #7: Accepted, time=62ms, mem=37870KB, score=10
    测试数据 #8: Accepted, time=62ms, mem=37870KB, score=10
    测试数据 #9: Accepted, time=202ms, mem=37870KB, score=10
    测试数据 #10: Accepted, time=327ms, mem=37870KB, score=10
    Time = 1337ms Mem = 37874KB Score= 100

    program editor;
    
    
    Type
     rec=record
      l,r,fa,s:longint;
      w:char;
     end;
    
    Var
     n,m,i,h,now,len,top,u,t:longint;
     c:char;
     ss:array[0..1800000] of char;
     f:array[0..1800000] of rec;
    
    Procedure readchar(P:longint);inline;
    var
     c:char;
      begin
      while p>0 do begin read(c);dec(p); end;
    end;
    
    Procedure update(P:longint);inline;
      begin
      if p=0 then exit;
      f[p].s:=f[f[p].l].s+f[f[p].r].s+1;
    end;
    
    Procedure zig(P:longint);inline;
    var
     u:longint;
      begin
      u:=f[p].r;
      if u=0 then exit;//重要!
      f[p].r:=f[u].l;
      if f[p].r<>0 then f[f[p].r].fa:=p;
      f[u].fa:=f[p].fa;
      if f[p].fa<>0 then if f[f[p].fa].l=p then f[f[p].fa].l:=u else f[f[p].fa].r:=u else h:=u;
      f[u].l:=p;
      f[p].fa:=u;
      update(p);update(u);
    end;
    
    Procedure zag(P:longint);inline;
    var
     u:longint;
      begin
      u:=f[p].l;
      if u=0 then exit;
      f[p].l:=f[u].r;
      if f[p].l<>0 then f[f[p].l].fa:=p;
      f[u].fa:=f[p].fa;
      if f[p].fa<>0 then if f[f[p].fa].l=p then f[f[p].fa].l:=u else f[f[p].fa].r:=u else h:=u;
      f[u].r:=p;
      f[p].fa:=u;
      update(p);
      update(u);
    end;
    
    Procedure up(x,root:longint);inline;
      begin
      if f[root].l=x then zag(root) else zig(root);
    end;
    
    Procedure splay(P,tar:longint);inline;
    var
     x,y,z:longint;
      begin
      x:=p;y:=f[x].fa;z:=f[y].fa;
      while y<>tar do
        begin
        if z=tar then begin up(x,y);break; end;
        if ((f[z].l=y) xor (f[y].l=x))=false then
          begin
          up(y,z);
          up(x,y);
        end else
          begin
          up(x,y);
          up(y,z);
        end;
        y:=f[x].fa;
        z:=f[y].fa;
      end;
    end;
    
    Function Fnext:longint;inline;
    var
     x,y:longint;
      begin
      if f[now].r<>0 then
        begin
        fnext:=f[now].r;
        while f[fnext].l<>0 do fnext:=f[fnext].l;
        exit(fnext);
      end;
      x:=now;
      y:=f[now].fa;
      while f[y].r=x do begin y:=f[y].fa;x:=f[x].fa; end;
      exit(y);
      splay(now,0);
    end;
    
    Procedure next;inline;
      begin
      now:=fnext;
    end;
    
    Procedure prev;inline;
    var
     x,y:longint;
      begin
      if f[now].l<>0 then
        begin
        now:=f[now].l;
        while f[now].r<>0 do now:=f[now].r;
        exit;
      end;
      x:=now;
      y:=f[x].fa;
      while f[y].l=x do begin y:=f[y].fa;x:=f[x].fa; end;
      now:=y;
      splay(now,0);
    end;
    
    Function index(P,num:longint):longint;
      begin
      while true do begin
      if f[f[p].l].s+1=num then exit(p);
      if f[f[p].l].s+1<num then
        begin
        dec(num,f[f[p].l].s+1);
        p:=f[p].r;
      end
      else
        p:=f[p].l;
      end;
    end;
    
    Procedure move(P:longint); inline;
      begin
      now:=index(h,p+1);
    end;
    
    Procedure print(P:longint);
      begin
      if f[p].l>0 then print(f[p].l);
      {if (f[p].w>#31) and (f[p].w<#127) then} write(f[p].w);
      if f[p].r>0 then print(f[p].r);
    end;
    
    Procedure get(P:longint); inline;
    var
     x:longint;
      begin
      splay(now,0);  x:=index(h,f[f[now].l].s+2+p);
      splay(x,now);
      print(f[x].l);
    end;
    
    Procedure Delete(P:longint); inline;
    var
     x:longint;
      begin
      splay(now,0);  x:=index(h,f[f[now].l].s+2+p);
      splay(x,now);
      f[x].l:=0;
      while x<>0 do
        begin
        dec(f[x].s,p);
        x:=f[x].fa;
      end;
    end;
    
    Function add(pfa:longint):longint; inline;
      begin
      inc(top);
      f[top].fa:=pfa;
      exit(top);
    end;
    
    Procedure build(p,l,r:longint);
    var
     mid:longint;
      begin
      mid:=(l+r) div 2;
      f[p].w:=ss[mid];
      f[p].s:=r-l+1;
      if l=r then exit;
      if mid>l then begin f[p].l:=add(p);
      build(f[p].l,l,mid-1); end;
      if mid<r then begin f[p].r:=add(p);
      build(f[p].r,mid+1,r); end;
    end;
    
    Procedure insert;
    var
     u:longint;
      begin
      splay(now,0);
      u:=fnext;
      f[u].l:=add(u);
      build(f[u].l,1,len);
      while u>0 do
        begin
        inc(f[u].s,len);
        u:=f[u].fa;
      end;
    end;
    
      begin
      
      with f[1] do
        begin
        s:=2;
        w:=#1;
        r:=2;
      end;
      with f[2] do
        begin
        s:=1;
        w:=#255;
        fa:=1;
      end;
      top:=2;
      now:=1; h:=1;
      readln(t);
      while t>0 do
        begin
        dec(t);
        read(c);
        case c of
          'M':
            begin
            readchar(3);
            readln(u);
            move(u);
          end;
          'I':
            begin
            readchar(5);
            readln(len);
            for i:=1 to len do
              begin
              read(ss[i]);
              while eoln do readln;
            end;
            insert;
          end;
          'N':
            begin
            readchar(3);
            readln;
            next;
          end;
          'P':
            begin
            readchar(3);
            readln;
            prev;
          end;
          'D':
            begin
            readchar(5);
            readln(u);
            delete(u);
          end;
          'G':
            begin
            readchar(3);
            readln(u);
            get(u);
            writeln;
          end;
        end;
    
      end;
    
    end.
    
  • 相关阅读:
    Spring MVC与JAX-RS比较与分析
    JDK历史版本下载
    第六篇:为多态基类声明虚析构函数
    第五篇:明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数
    第四篇:了解 C++ 默默编写并调用的函数
    第三篇:确保对象在被使用前的初始化
    poj 2125(最小割)
    hdu 4704(费马小定理)
    hdu 4705(树形DP)
    poj 3469(网络流模版)
  • 原文地址:https://www.cnblogs.com/htfy/p/3069986.html
Copyright © 2020-2023  润新知