平衡树模板 bzoj 3224
program t3224;
var
tr:array[-1..1000000,1..2] of int64;
num,fa,size,quan:array[-1..1000000] of int64;
i,n,sz,rt:longint;
x,y:int64;
function judge(a:boolean):longint;
begin
if a then exit(1) else exit(2);
end;
procedure rotate(k:longint);
var
f,ff,lr,szlr,szk,x:longint;
begin
f:=fa[k]; ff:=fa[f];
x:=judge(tr[f,1]=k); lr:=tr[k,3-x];
szlr:=size[lr]; szk:=size[k];
tr[ff,judge(tr[ff,1]=f)]:=k; fa[k]:=ff; size[k]:=size[f];
tr[k,3-x]:=f; fa[f]:=k;
tr[f,x]:=lr; fa[lr]:=f; size[f]:=size[f]-szk+szlr;
end;
procedure splay(k:longint);
var
f,ff,p,g1,g2:longint;
begin
if k=-1 then exit;
p:=k;
while fa[p]<>0 do
begin
f:=fa[p]; ff:=fa[f];
if ff=0 then begin rotate(p); break; end;
g1:=judge(tr[f,1]=p); g2:=judge(tr[ff,1]=f);
if (g1=g2)and(fa[ff]=0) then begin rotate(p); rotate(p); continue; end;
if g1=g2 then begin rotate(f); rotate(p); end;
if g1<>g2 then begin rotate(p); rotate(p); end;
end;
rt:=p;
end;
procedure inse(data:int64);
var
p,f:longint;
begin
p:=rt;
f:=0;
while p<>-1 do
begin
f:=p;
size[f]:=size[f]+1;
if data=num[p] then begin inc(quan[p]); splay(p); exit; end;
if data>num[p]
then begin p:=tr[p,2]; continue; end;
if data<num[p]
then p:=tr[p,1];
end;
inc(sz); num[sz]:=data; quan[sz]:=1; size[sz]:=1;
fa[sz]:=f; tr[sz,1]:=-1; tr[sz,2]:=-1;
if data>num[f] then tr[f,2]:=sz else tr[f,1]:=sz;
splay(sz);
end;
function findrank(data:int64):int64;
var
p:longint;
begin
p:=rt;
while true do
begin
if num[p]>data then p:=tr[p,1];
if num[p]<data then p:=tr[p,2];
if num[p]=data then break;
end;
splay(p);
exit(size[tr[p,1]]+1);
end;
procedure dele(data:int64);
var
p,p1,p2:longint;
begin
p:=rt;
while true do
begin
if num[p]>data then p:=tr[p,1];
if num[p]<data then p:=tr[p,2];
if num[p]=data then break;
end;
splay(p);
if quan[p]>1 then begin dec(quan[p]); dec(size[p]); exit; end;
if quan[p]=1
then begin
p1:=tr[rt,1];
while tr[p1,2]<>-1 do
p1:=tr[p1,2];
p2:=tr[rt,2];
while tr[p2,1]<>-1 do
p2:=tr[p2,1];
splay(p2); splay(p1);
dec(size[rt]);
dec(size[tr[rt,2]]);
tr[tr[rt,2],1]:=-1;
end;
end;
function pre(data:int64):int64;
var
p:longint;
begin
inse(data);
p:=tr[rt,1];
while tr[p,2]<>-1 do
p:=tr[p,2];
dele(data);
exit(num[p]);
end;
function suc(data:int64):int64;
var
p:longint;
begin
inse(data);
p:=tr[rt,2];
while tr[p,1]<>-1 do
p:=tr[p,1];
dele(data);
exit(num[p]);
end;
function finddata(rank:longint):int64;
var
p:longint;
begin
p:=rt;
inc(rank);
while not((size[tr[p,1]]<rank)and(size[tr[p,1]]+quan[p]>=rank)) do
begin
if size[tr[p,1]]>=rank then begin p:=tr[p,1]; continue; end;
if size[tr[p,1]]<rank then begin rank:=rank-size[tr[p,1]]-quan[p]; p:=tr[p,2]; end;
end;
exit(num[p]);
end;
begin
readln(n);
sz:=0;
rt:=-1;
size[0]:=0;
inse(maxlongint*1000);
inse(-maxlongint*1000);
for i:=1 to n do
begin
readln(x,y);
if x=1 then inse(y);
if x=2 then dele(y);
if x=3 then writeln(findrank(y)-1);
if x=4 then writeln(finddata(y));
if x=5 then writeln(pre(y));
if x=6 then writeln(suc(y));
end;
end.
平衡树模板 bzoj 3224的更多相关文章
- 普通平衡树(bzoj 3224)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- BZOJ 3224 普通平衡树(Treap模板题)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 14301 Solved: 6208 [Submit][ ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- HDU 4006 The kth great number 优先队列、平衡树模板题(SBT)
The kth great number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Oth ...
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 22483 Solved: 10130[Submit][S ...
- BZOJ 3224 Tyvj 1728 普通平衡树模板
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以 ...
- fhq_treap || BZOJ 3224: Tyvj 1728 普通平衡树 || Luogu P3369 【模板】普通平衡树
题面:[模板]普通平衡树 代码: #include<cstdio> #include<cstring> #include<iostream> #include< ...
- BZOJ 3224 普通平衡树 | 平衡树模板
#include <cstdio> #include <cmath> #include <cstring> #include <algorithm> # ...
随机推荐
- java中的类型比较
Java 里的既可以比较基本类型也可以比较引用类型. 对于基本类型,Java 的==比较值比较 对于引用类型,Java 的==比较了引用的是否为同一个对象(比较内存地址), 也就是说这两个变量是否都指 ...
- java如何得到GET和POST请求URL和参数列表(转)
在servlet中GET请求可以通过HttpServletRequest的getRequestURL方法和getQueryString()得到完整的请求路径和请求所有参数列表,POST的需要getPa ...
- UART UVM验证平台平台搭建总结
tb_top是整个UVM验证平台的最顶层:tb_top中例化dut,提供时钟和复位信号,定义接口以及设置driver和monitor的virual interface,在intial中调用run_te ...
- 2016.02.17 JS DOM编程艺术 第四五六章
看完这三章内容,集中精力,加快速度.
- jquery 删除数组元素
expertsId.splice($.inArray(thisID.split('&')[0],expertsId),1); 1. expertsId数组名2. thisID.split('& ...
- Python-内置类属性
Python内置类属性 __dict__ : 类的属性(包含一个字典,由类的数据属性组成) __doc__ :类的文档字符串 __name__: 类名 __module__: 类定义所在的模块(类的全 ...
- java.io.Serializable 序列化问题
java.io.Serializable 序列化问题 Person.java package a.b.c; public class Person implements java.io.Seriali ...
- hdu 1577 WisKey的眼神 (数学几何)
WisKey的眼神 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- SQL语句-批量插入表(表数据插表)
批量插入表(表数据插表) ****1.INSERT INTO SELECT语句语句形式为:Insert into Table2(field1,field2,...) select value1,val ...
- plupload简易应用 多图片上传显示预览以及删除
<script> var uploader = new plupload.Uploader({ //实例化一个plupload上传对象 browse_button: 'btnBrowse' ...