bzoj3224 treap模版

bzoj3224 treap模版
  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.
View Code

3224: Tyvj 1728 普通平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 3847  Solved: 1575
[Submit][Status][Discuss]

Description

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)

Input

第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)

Output

对于操作3,4,5,6每行输出一个数,表示对应答案

Sample Input

10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598

Sample Output

106465
84185
492737

HINT

 

1.n的数据范围:n<=100000

2.每个数的数据范围:[-1e7,1e7]

 

Source

[ Submit][ Status][ Discuss]

你可能感兴趣的:(ZOJ)