HNOI2004宠物收养所(平衡树)
treap!
var i,n,x,y,ans,a,b,root,tot,ft:longint;
l,r,s,v,hr:array[..] of longint;
procedure r_rotate(var x:longint);
var y:longint;
begin
y:=l[x];
l[x]:=r[y];
r[y]:=x;
s[y]:=s[x];
s[x]:=s[l[x]]+s[r[x]]+;
x:=y;
end;
procedure l_rotate(var x:longint);
var y:longint;
begin
y:=r[x];
r[x]:=l[y];
l[y]:=x;
s[y]:=s[x];
s[x]:=s[l[x]]+s[r[x]]+;
x:=y;
end;
procedure insert(var k,key:longint);
begin
if k= then
begin
inc(tot);
k:=tot;
l[k]:=;
r[k]:=;
s[k]:=;
v[k]:=key;
hr[k]:=random(maxlongint);
exit;
end;
inc(s[k]);
if key<=v[k] then
begin
insert(l[k],key);
if hr[l[k]]>hr[k] then r_rotate(k);
end
else
begin
insert(r[k],key);
if hr[r[k]]>hr[k] then l_rotate(k);
end;
end;
function delete(var k:longint;key:longint):longint;
begin
dec(s[k]);
if (key=v[k]) or ((key<=v[k]) and (l[k]=)) or ((key>v[k]) and (r[k]=)) then
begin
delete:=v[k];
if (l[k]=) or (r[k]=) then k:=l[k]+r[k]
else v[k]:=delete(l[k],key+);
exit;
end;
if key<=v[k] then exit(delete(l[k],key))
else exit(delete(r[k],key));
end;
function pre(var k,key:longint):longint;
begin
if k= then exit(-);
if key<=v[k] then exit(pre(l[k],key))
else
begin
pre:=pre(r[k],key);
if pre=- then pre:=v[k];
end;
end;
function suc(var k,key:longint):longint;
begin
if k= then exit(-);
if key>v[k] then exit(suc(r[k],key))
else
begin
suc:=suc(l[k],key);
if suc=- then suc:=v[k];
end;
end;
procedure main;
begin
readln(n);
ans:=;tot:=;root:=;s[root]:=;
for i:= to n do
begin
readln(x,y);
if x=ft then insert(root,y)
else
if s[root]= then
begin
ft:=x;
insert(root,y);
end
else
begin
a:=pre(root,y);b:=suc(root,y);
if a=- then a:=-maxlongint div ;
if b=- then b:=-maxlongint div ;
if abs(b-y)<abs(y-a) then
begin
ans:=(ans+abs(b-y)) mod ;
b:=delete(root,b);
end
else
begin
ans:=(ans+abs(y-a)) mod ;
a:=delete(root,a);
end;
end;
end;
writeln(ans);
end;
begin
main;
end.
插入操作还有另一种写法:
procedure maintain(var t:longint;flag:boolean);
begin
if not flag then
if s[l[l[t]]]>s[r[t]] then
right_rotate(t)
else
if s[r[l[t]]]>s[r[t]] then
begin
left_rotate(l[t]);
right_rotate(t);
end
else exit
else
if s[r[r[t]]]>s[l[t]] then
left_rotate(t)
else
if s[l[r[t]]]>s[l[t]] then
begin
right_rotate(r[t]);
left_rotate(t);
end
else exit;
maintain(l[t],false);
maintain(r[t],true);
maintain(t,true);
maintain(t,false);
end;
procedure insert(var t,v:longint);
begin
if t= then
begin
inc(tt);
t:=tt;
s[t]:=;
l[t]:=;
r[t]:=;
key[t]:=v;
end
else
begin
inc(s[t]);
if v<key[t] then insert(l[t],v)
else insert(r[t],v);
maintain(t,v>=key[t]);
end;
end;
还需要注意的是,如果题目中明确要求求前驱,即小于它的最大数。那么pre操作的返回值应设为正在查找中的关键值,这样可以使整个操作的返回值不会与原值相同。
如果题中并没有说明必须不同,例如本题,一个数的前驱可以是这个数,那么pre的返回值应设为-1.
(update:20140810 这不叫另一种写法。。。这叫SBT。。。当时真无知)
HNOI2004宠物收养所(平衡树)的更多相关文章
- [bzoj1208][HNOI2004][宠物收养所] (平衡树)
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- B1208 [HNOI2004]宠物收养所 平衡树||set (滑稽)
这个题是一道splay裸题,但是我不太会写,所以用set直接水过去!!!哈哈哈哈,美滋滋. set总结: set是一个集合,然后里面没用重复的元素.里面有一些函数: begin() ,返回se ...
- bzoj 1208 HNOI2004宠物收养所 平衡树
裸平衡树,恢复手感用的 //By BLADEVIL var n :longint; i :longint; x, y :longint; t, tot :longint; key, s, left, ...
- cogs62 [HNOI2004] 宠物收养所
cogs62 [HNOI2004] 宠物收养所 啦啦啦啦 不维护区间的平衡树题都是树状数组+二分练手题! 不会的参考我的普通平衡树的多种神奇解法之BIT+二分答案 // It is made by X ...
- BZOJ 1208: [HNOI2004]宠物收养所
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7514 Solved: 2982[Submit][Sta ...
- bzoj 1208: [HNOI2004]宠物收养所 set
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7328 Solved: 2892[Submit][Sta ...
- 数据结构(set):COGS 62. [HNOI2004] 宠物收养所
62. [HNOI2004] 宠物收养所 ★★★ 输入文件:pet.in 输出文件:pet.out 简单对比时间限制:1 s 内存限制:128 MB 最近,阿Q开了一间宠物收养所.收养 ...
- bzoj1208 [HNOI2004]宠物收养所(STL,Treap)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5956 Solved: 2317[Submit][Sta ...
- BZOJ 1208: [HNOI2004]宠物收养所(BST)
本来想先用set写一遍,再自己写个splay或treap,不过用set过了之后就懒得去写了....以后有空再来写吧..(不会有空的吧= = ------------------------------ ...
- BZOJ_1208_[HNOI2004]宠物收养所_SPLAY
BZOJ_1208_[HNOI2004]宠物收养所_SPLAY Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望 ...
随机推荐
- java集合类(六)About Queue
接上篇“java集合类(五)About Map” 终于来到了java集合类的尾声,太兴奋了,不是因为可以休息一阵了,而是因为又到了开启新知识的时刻,大家一起加油打气!!Come on...Fighti ...
- [转载+原创]Emgu CV on C# (四) —— Emgu CV on 全局固定阈值二值化
重点介绍了全局二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数) 1.概述 图像二值化是图像处理中的一项基本技术,也 ...
- PythonChallenge 1:恺撒密码的解码
题目: 解题思路:根据图中的K→M,O→Q,E→G,我们可以发现K,O,E这三个字母都向后移动了2位.据说恺撒率先使用了这一加密方法,因此将其命名为恺撒密码.它的基本思想是:通过把字母移动一定的位数来 ...
- HDU 4811 Ball 贪心
题目链接: 题目 Ball Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) 问题描述 ...
- 不安装Oracle客户端远程连接Orcale数据库
本方法是通过使用ORACLE官方提供的精简版客户端,即绿色免安装的客户端. 下载地址(此处提供的是官方各版本下载地址): Windows 32位系统中使用的客户端下载地址其他系统环境中使用的客户端下载 ...
- cf 359A 359B
359A 如果有点在边上则最少两次 没有则最少操作4次 #include <cstdio> #include <cstring> #include <algorithm& ...
- Chp11: Sorting and Searching
Common Sorting Algo: Bubble Sort: Runime: O(n2) average and worst case. Memory: O(1). void BubbleSor ...
- 纯互联网项目“失宠”乐博资本杨宁称今后只投O2O
从去年开始,我们接下来会进入全新的时代,就是智能一切的时代!过去的互联网都在电脑里,都在服务器里,包括现在移动云也是,大数据都是在服务器里面,真正我们身边的东西,智能含量是非常低的.包括你家洗衣机.冰 ...
- Java学习笔记(一) java介绍
编程语言分为:编译型语言和解释型语言. 编译型语言需要经过特定编译器通过一次性编译,成为该特定平台硬件可执行的机器码,可脱离开发环境独立运行,运行效率较高,但是无法跨平台移植. 解释型语言需要经过特定 ...
- Spring + JMS + ActiveMQ实现简单的消息队列(监听器异步实现)
首先声明:以下内容均是在网上找别人的博客综合学习而成的,可能会发现某些代码与其他博主的相同,由于参考的文章比较多,这里对你们表示感谢,就不一一列举,如果有侵权的地方,请通知我,我可以把该文章删除. 1 ...