具体是啥我就不说了,应某位同学的要求贴上来。 曾经测过,速度还说的过去,在所有的平衡树版本里排中等偏上~ 以下是几个神牛标程和几个同学的测试结果,差的并不太多~ 【代码】: program sbt; const inf=1000000; type ntype=record left,right,data,key,count,size:longint; end; var n,k,x,root,tot,i:longint; tree:array[0..1000001] of ntype; procedure modify(p:longint); begin tree[p].size:=tree[tree[p].left].size+tree[tree[p].right].size+tree[p].count; end; procedure leftrotate(var p:longint); var t:longint; begin t:=tree[p].left; tree[p].left:=tree[t].right; tree[t].right:=p; modify(p); p:=t; modify(p); end; procedure rightrotate(var p:longint); var t:longint; begin t:=tree[p].right; tree[p].right:=tree[t].left; tree[t].left:=p; modify(p); p:=t; modify(p); end; procedure insert(var p:longint;x:longint); begin if p=0 then begin inc(tot); p:=tot; tree[p].left:=0; tree[p].right:=0; tree[p].data:=x; tree[p].key:=random(inf); tree[p].size:=1; tree[p].count:=1; end else begin if x=tree[p].data then inc(tree[p].count) else if x<tree[p].data then begin insert(tree[p].left,x); if tree[tree[p].left].key<tree[p].key then leftrotate(p); end else begin insert(tree[p].right,x); if tree[tree[p].right].key<tree[p].key then rightrotate(p); end; modify(p); end; end; procedure delete(var p:longint;x:longint); begin if p=0 then exit; if x<tree[p].data then delete(tree[p].left,x) else if x>tree[p].data then delete(tree[p].right,x) else begin if tree[p].count>1 then dec(tree[p].count) else if tree[p].left=0 then p:=tree[p].right else if tree[p].right=0 then p:=tree[p].left else if tree[tree[p].left].key<tree[tree[p].right].key then begin leftrotate(p); delete(tree[p].right,x); end else begin rightrotate(p); delete(tree[p].left,x); end; end; if p<>0 then modify(p); end; function findkth(p,x:longint):longint; begin if x<=tree[tree[p].left].size then exit(findkth(tree[p].left,x)) else if x<=tree[tree[p].left].size+tree[p].count then exit(tree[p].data) else exit(findkth(tree[p].right,x-tree[tree[p].left].size-tree[p].count)); end; begin assign(input,'sbt.in'); assign(output,'sbt.out'); reset(input); rewrite(output); readln(n); root:=0; tot:=0; randomize; for i:=1 to n do begin read(k,x); case k of 1:insert(root,x); 2:begin if tree[root].size>=x then writeln(findkth(root,x)) else writeln(0); end; 3:delete(root,x); end; end; close(input); close(output); end.