• bzoj3196


    平衡树系列终于完结,撒花

    裸的树套树,扔代码跑

      1 const mo=20306789;
      2 var w,b,s,key,fa:array[0..4000010] of longint;
      3     son:array[0..4000010,1..2] of longint;
      4     a,root:array[0..60010*4] of longint;
      5     i,n,m,x,y,k,ch,ans,t:longint;
      6 
      7 function max(a,b:longint):longint;
      8   begin
      9     if a>b then exit(a) else exit(b);
     10   end;
     11 
     12 function min(a,b:longint):longint;
     13   begin
     14     if a>b then exit(b) else exit(a);
     15   end;
     16 
     17 procedure open(x:longint);
     18   begin
     19     inc(t);
     20     b[t]:=x;
     21     w[t]:=1;  s[t]:=1;
     22     key[t]:=trunc(random*mo)+1;
     23   end;
     24 
     25 procedure update(x:longint);
     26   begin
     27     s[x]:=s[son[x,1]]+s[son[x,2]]+w[x];
     28   end;
     29 
     30 procedure rotate(i,x,w:longint);
     31   var y:longint;
     32   begin
     33     y:=fa[x];
     34     if fa[y]<>0 then
     35     begin
     36       if son[fa[y],1]=y then son[fa[y],1]:=x
     37       else son[fa[y],2]:=x;
     38     end
     39     else root[i]:=x;
     40     fa[x]:=fa[y];
     41     son[y,3-w]:=son[x,w];
     42     if son[x,w]<>0 then fa[son[x,w]]:=y;
     43     son[x,w]:=y;
     44     fa[y]:=x;
     45     update(y);
     46     update(x);
     47   end;
     48 
     49 procedure up(i,x:longint);
     50   var y:longint;
     51   begin
     52     y:=fa[x];
     53     while (y<>0) and (key[y]>key[x]) do
     54     begin
     55       if son[y,1]=x then rotate(i,x,2)
     56       else rotate(i,x,1);
     57       y:=fa[x];
     58     end;
     59   end;
     60 
     61 procedure add(i,x:longint);
     62   var p:longint;
     63   begin
     64     if root[i]=0 then
     65     begin
     66       open(x);
     67       root[i]:=t;
     68     end
     69     else begin
     70       p:=root[i];
     71       repeat
     72         inc(s[p]);
     73         if b[p]=x then
     74         begin
     75           inc(w[p]);
     76           exit;
     77         end
     78         else if b[p]>x then
     79         begin
     80           if son[p,1]=0 then break;
     81           p:=son[p,1];
     82         end
     83         else begin
     84           if son[p,2]=0 then break;
     85           p:=son[p,2];
     86         end;
     87       until false;
     88       open(x);
     89       fa[t]:=p;
     90       if b[p]>x then son[p,1]:=t else son[p,2]:=t;
     91       up(i,t);
     92     end;
     93   end;
     94 
     95 procedure sift(i,x:longint);
     96   var j1,j2:longint;
     97   begin
     98     repeat
     99       j1:=son[x,1]; j2:=son[x,2];
    100       if j1+j2=0 then break;
    101       if (j2<>0) and ((key[j1]>key[j2]) or (j1=0)) then
    102       begin
    103         rotate(i,j2,1);
    104         dec(s[j2]);
    105       end
    106       else begin
    107         rotate(i,j1,2);
    108         dec(s[j1]);
    109       end;
    110     until false;
    111     if son[fa[x],1]=x then son[fa[x],1]:=0 else son[fa[x],2]:=0;
    112     fa[x]:=0; w[x]:=0; s[x]:=0;
    113   end;
    114 
    115 procedure del(i,x:longint);
    116   var p:longint;
    117   begin
    118     p:=root[i];
    119     repeat
    120       dec(s[p]);
    121       if b[p]=x then
    122       begin
    123         if w[p]=1 then sift(i,p)
    124         else dec(w[p]);
    125         break;
    126       end
    127       else if b[p]>x then p:=son[p,1]
    128       else p:=son[p,2];
    129     until false;
    130   end;
    131 
    132 procedure build(i,l,r,x:longint);
    133   var m:longint;
    134   begin
    135     add(i,a[x]);
    136     if l<>r then
    137     begin
    138       m:=(l+r) shr 1;
    139       if x<=m then build(i*2,l,m,x)
    140       else build(i*2+1,m+1,r,x);
    141     end;
    142   end;
    143 
    144 procedure change(i,l,r,x,y:longint);
    145   var m:longint;
    146   begin
    147     add(i,y);
    148     del(i,a[x]);
    149     if l<>r then
    150     begin
    151       m:=(l+r) shr 1;
    152       if x<=m then change(i*2,l,m,x,y)
    153       else change(i*2+1,m+1,r,x,y);
    154     end;
    155   end;
    156 
    157 function rank(i,x:longint):longint;
    158   var p:longint;
    159   begin
    160     p:=root[i];
    161     rank:=0;
    162     while p<>0 do
    163     begin
    164       if b[p]=x then
    165       begin
    166         rank:=rank+s[son[p,1]];
    167         break;
    168       end
    169       else if b[p]>x then p:=son[p,1]
    170       else begin
    171         rank:=rank+s[son[p,1]]+w[p];
    172         p:=son[p,2];
    173       end;
    174     end;
    175   end;
    176 
    177 procedure getrank(i,l,r,k:longint);
    178   var m:longint;
    179   begin
    180     if (x<=l) and (y>=r) then ans:=ans+rank(i,k)
    181     else begin
    182       m:=(l+r) shr 1;
    183       if x<=m then getrank(i*2,l,m,k);
    184       if y>m then getrank(i*2+1,m+1,r,k);
    185     end;
    186   end;
    187 
    188 function what(k:longint):longint;
    189   var l,r,m:longint;
    190   begin
    191     l:=0;
    192     r:=100000000;
    193     what:=0;
    194     while l<=r do
    195     begin
    196       m:=(l+r) shr 1;
    197       ans:=0; getrank(1,1,n,m);
    198       if ans<=k then
    199       begin
    200         what:=m;
    201         l:=m+1;
    202       end
    203       else r:=m-1;
    204     end;
    205   end;
    206 
    207 procedure pre(i,x:longint);
    208   var p:longint;
    209   begin
    210     p:=root[i];
    211     while p<>0 do
    212     begin
    213       if b[p]>=x then p:=son[p,1]
    214       else begin
    215         ans:=max(ans,b[p]);
    216         p:=son[p,2];
    217       end;
    218     end;
    219   end;
    220 
    221 procedure suffix(i,x:longint);
    222   var p:longint;
    223   begin
    224     p:=root[i];
    225     while p<>0 do
    226     begin
    227       if b[p]<=x then p:=son[p,2]
    228       else begin
    229         ans:=min(ans,b[p]);
    230         p:=son[p,1];
    231       end;
    232     end;
    233   end;
    234 
    235 procedure askpre(i,l,r:longint);
    236   var m:longint;
    237   begin
    238     if (x<=l) and (y>=r) then pre(i,k)
    239     else begin
    240       m:=(l+r) shr 1;
    241       if x<=m then askpre(i*2,l,m);
    242       if y>m then askpre(i*2+1,m+1,r);
    243     end;
    244   end;
    245 
    246 procedure asksuf(i,l,r:longint);
    247   var m:longint;
    248   begin
    249     if (x<=l) and (y>=r) then suffix(i,k)
    250     else begin
    251       m:=(l+r) shr 1;
    252       if x<=m then asksuf(i*2,l,m);
    253       if y>m then asksuf(i*2+1,m+1,r);
    254     end;
    255   end;
    256 
    257 begin
    258   randomize;
    259   readln(n,m);
    260   for i:=1 to n do
    261     read(a[i]);
    262   for i:=1 to n do
    263     build(1,1,n,i);
    264   for i:=1 to m do
    265   begin
    266     read(ch);
    267     if ch=1 then
    268     begin
    269       readln(x,y,k);
    270       ans:=0; getrank(1,1,n,k);
    271       writeln(ans+1);
    272     end
    273     else if ch=2 then
    274     begin
    275       readln(x,y,k);
    276       writeln(what(k-1));
    277     end
    278     else if ch=3 then
    279     begin
    280       readln(x,k);
    281       change(1,1,n,x,k);
    282       a[x]:=k;
    283     end
    284     else if ch=4 then
    285     begin
    286       readln(x,y,k);
    287       ans:=0; askpre(1,1,n);
    288       writeln(ans);
    289     end
    290     else if ch=5 then
    291     begin
    292       readln(x,y,k);
    293       ans:=100000000; asksuf(1,1,n);
    294       writeln(ans);
    295     end;
    296   end;
    297 end.
    View Code
  • 相关阅读:
    JavaBasics-15-多线程
    4.10 SpringCloud微服务技术栈
    4.3 Linux操作系统_Unix操作系统
    4.2 互联网项目架构演进
    4.1 微服务框架_引言
    4.6 Redis
    SpringBoot
    docker-dockerfile实战构建文件
    docker 安装私有仓库 registry(离线)
    基础K8S搭建(20209.08亲测成功)
  • 原文地址:https://www.cnblogs.com/phile/p/4490789.html
Copyright © 2020-2023  润新知