码迷,mamicode.com
首页 > 其他好文 > 详细

treap模版

时间:2015-06-18 11:25:08      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
  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]

treap模版

标签:

原文地址:http://www.cnblogs.com/chensiang/p/4585143.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!