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开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望 ...
随机推荐
- [转载]eclipse中设置文件的编码格式为utf-8
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除. 原文作者:ryxxlong 原文地址:http://ryxxlong.iteye ...
- Linux查看系统基本信息
问题描述: 查看系统基本信息 问题解决: (1)lspci 是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具. 用法: lspci -v (1.1) ...
- springMVC 简单事例
本帖最后由 悲观主义者一枚 于 2015-1-31 17:55 编辑 使用SpringMvc开发Android WebService入门教程1.首先大家先创建一个JavaWeb项目2.然后加入Spri ...
- MonoBehaviour.StopCoroutine
MonoBehaviour.StopCoroutine Description Stops all coroutines named methodName running on this behavi ...
- jstl删除session,choose,动态获取request当前工程路径
1.jstl标签c:remove删除session request.getSession().setAttribute("ssmsg", "修改成功"); &l ...
- linux源代码阅读笔记 get_free_page()代码分析
/* 34 * Get physical address of first (actually last :-) free page, and mark it 35 * used. If no fre ...
- python库:fuzzywuzzy
fuzzywuzzy 用于字符串匹配率.令牌匹配等 复制代码代码如下: from fuzzywuzzy import fuzzfuzz.ratio("Hit me with your bes ...
- java基础知识回顾之---java String final类构造方法
/** * String 构造方法学习 * String(byte[ ] bytes):通过byte数组构造字符串对象. * String(byte[] bytes, int offs ...
- Android 异步加载
Android 4.0 后 貌似规定了 在主线程中不允许访问网络,在子线程中不允许修改UI. 否则会抛出NetworkOnMainThreadException 异常 解决办法: 采用继承 Async ...
- 使用ajax()方法加载服务器数据
使用ajax()方法加载服务器数据 使用ajax()方法是最底层.功能最强大的请求服务器数据的方法,它不仅可以获取服务器返回的数据,还能向服务器发送请求并传递数值,它的调用格式如下: jQuery.a ...