您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
标签:
1 program hehe; 2 type 3 shu=record 4 l,r,w,h,y,s:longint; 5 end; 6 var 7 n,i,j,k,ans,root,size:longint; 8 x:array[0..100000] of shu; 9 10 procedure update(a:longint); 11 begin 12 x[a].s:=x[x[a].l].s+x[x[a].r].s+x[a].w; 13 end; 14 15 procedure rturn(var a:longint); 16 var 17 t:longint; 18 begin 19 t:=x[a].l; 20 x[a].l:=x[t].r; 21 x[t].r:=a; 22 x[t].s:=x[a].s; 23 update(a); 24 a:=t; 25 end; 26 27 procedure lturn(var a:longint); 28 var 29 t:longint; 30 begin 31 t:=x[a].r; 32 x[a].r:=x[t].l; 33 x[t].l:=a; 34 x[t].s:=x[a].s; 35 update(a); 36 a:=t; 37 end; 38 39 procedure insert(var a:longint;b:longint); 40 begin 41 if a=0 then 42 begin 43 inc(size); 44 a:=size; 45 x[a].s:=1; 46 x[a].w:=1; 47 x[a].h:=b; 48 x[a].y:=random(maxlongint); 49 exit; 50 end; 51 inc(x[a].s); 52 if x[a].h=b then inc(x[a].w) 53 else if b>x[a].h then 54 begin 55 insert(x[a].r,b); 56 if x[x[a].r].y<x[a].y then lturn(a); 57 end 58 else 59 begin 60 insert(x[a].l,b); 61 if x[x[a].l].y<x[a].y then rturn(a); 62 end; 63 end; 64 65 procedure del(var a:longint;b:longint); 66 begin 67 if a=0 then exit; 68 if x[a].h=b then 69 begin 70 if x[a].w>1 then 71 begin 72 dec(x[a].w); 73 dec(x[a].s); 74 exit; 75 end; 76 if x[a].l*x[a].r=0 then a:=x[a].l+x[a].r 77 else if x[x[a].l].y<x[x[a].r].y then 78 begin 79 rturn(a); 80 del(a,b); 81 end else 82 begin 83 lturn(a); 84 del(a,b); 85 end; 86 end 87 else if b>x[a].h then 88 begin 89 dec(x[a].s); 90 del(x[a].r,b); 91 end 92 else 93 begin 94 dec(x[a].s); 95 del(x[a].l,b); 96 end; 97 end; 98 99 function rank(a,b:longint):longint; 100 begin 101 if a=0 then exit(0); 102 if x[a].h=b then exit(x[x[a].l].s+1) 103 else if b>x[a].h then exit(rank(x[a].r,b)+x[x[a].l].s+x[a].w) 104 else exit(rank(x[a].l,b)); 105 end; 106 107 function num(a,b:longint):longint; 108 begin 109 if a=0 then exit(0); 110 if b<=x[x[a].l].s then exit(num(x[a].l,b)) 111 else if b>x[x[a].l].s+x[a].w then exit(num(x[a].r,b-x[x[a].l].s-x[a].w)) 112 else exit(x[a].h); 113 end; 114 115 procedure pre(a,b:longint); 116 begin 117 if a=0 then exit; 118 if x[a].h<b then 119 begin 120 ans:=a; 121 pre(x[a].r,b); 122 end 123 else pre(x[a].l,b); 124 end; 125 126 procedure suc(a,b:longint); 127 begin 128 if a=0 then exit; 129 if x[a].h>b then 130 begin 131 ans:=a; 132 suc(x[a].l,b); 133 end 134 else suc(x[a].r,b); 135 end; 136 137 begin 138 readln(n); 139 for i:=1 to n do 140 begin 141 read(j,k); 142 case j of 143 1:insert(root,k); 144 2:del(root,k); 145 3:writeln(rank(root,k)); 146 4:writeln(num(root,k)); 147 5:begin 148 ans:=0; 149 pre(root,k); 150 writeln(x[ans].h); 151 end; 152 6:begin 153 ans:=0; 154 suc(root,k); 155 writeln(x[ans].h); 156 end; 157 end; 158 end; 159 end.
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)
对于操作3,4,5,6每行输出一个数,表示对应答案
标签:
原文地址:http://www.cnblogs.com/chensiang/p/4585143.html