平衡树模板 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> # ...
随机推荐
- NHibernate系列文章四:NHibernate运行时监控
摘要 有三种方式可以实现NHibernate运行时监控,监控的信息包括:执行了的SQL语句.NHibernate执行过程.数据库性能分析.这对我们学习NHibernate有很大的帮助,在工作中也能快速 ...
- 移动端自动化环境搭建-python的安装
安装python A.安装依赖 由于 Robot Framework 框架是基于 Python 语言开发的,要想使用 Robot Framework 首先需要有 Python环境. B.安装过程 下载 ...
- 转:MVC单表多按钮提交
有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...
- VC++ 动态生成 成组的 RadioButton 按钮组
先说一下 静态创建的方法: 单选按钮也属于CButton类,但由于单选按钮总是成组使用的,所以它在制作和使用上与普通按钮有一定区别.假设有三个单选按钮组成一组,初始时,第一个单选按钮处于选中状态.我们 ...
- LoadRunner ---思考时间设置
用户访问某个网站或软件,一般不会不停地做个各种操作,例如一次查询,用户需要时间查看查询的结果是否是自己想要的.例如一次订单提交,用户需要时间核对自己填写的信息是否正确等. 也就是说用户在做某些操作时, ...
- 本地缺Android SDK版本20,Unable to resolve target 'android-20'
解决方案一 本地缺Android SDK版本20,Unable to resolve target 'android-20' 通过SDK Manager安装一个Android 20. 解决方案二: L ...
- ajax 调用 JSON.parse();
$.ajax({ type : "POST", data:{ createStartTime:createStartT ...
- HTML5和CSS3基础教程(第8版)-读书笔记(4)
第16章 表单 表单有两个基本组成部分:访问者在页面上可以看见并填写的控件.标签和按钮的集合:以及用于获取信息并将其转化为可以读取或计算的格式的处理脚本. 基本的表单字段类型包括文本框.单选按钮.复选 ...
- JVM 基础知识
JVM 基础知识(GC) 2013-12-10 00:16 3190人阅读 评论(1) 收藏 举报 分类: Java(49) 目录(?)[+] 几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看 ...
- css3新属性@ text-shadow
text-shodow是css3的新属性,可以利用这个属性使字体更有立体感,还可以创造有趣的效果. 1.语法形式:text-shadow : x-offset(x轴偏移量) y-offset(y轴偏移 ...