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宠物收养所(平衡树)的更多相关文章

  1. [bzoj1208][HNOI2004][宠物收养所] (平衡树)

    Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...

  2. B1208 [HNOI2004]宠物收养所 平衡树||set (滑稽)

    这个题是一道splay裸题,但是我不太会写,所以用set直接水过去!!!哈哈哈哈,美滋滋. set总结: set是一个集合,然后里面没用重复的元素.里面有一些函数: begin()     ,返回se ...

  3. bzoj 1208 HNOI2004宠物收养所 平衡树

    裸平衡树,恢复手感用的 //By BLADEVIL var n :longint; i :longint; x, y :longint; t, tot :longint; key, s, left, ...

  4. cogs62 [HNOI2004] 宠物收养所

    cogs62 [HNOI2004] 宠物收养所 啦啦啦啦 不维护区间的平衡树题都是树状数组+二分练手题! 不会的参考我的普通平衡树的多种神奇解法之BIT+二分答案 // It is made by X ...

  5. BZOJ 1208: [HNOI2004]宠物收养所

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7514  Solved: 2982[Submit][Sta ...

  6. bzoj 1208: [HNOI2004]宠物收养所 set

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7328  Solved: 2892[Submit][Sta ...

  7. 数据结构(set):COGS 62. [HNOI2004] 宠物收养所

    62. [HNOI2004] 宠物收养所 ★★★   输入文件:pet.in   输出文件:pet.out   简单对比时间限制:1 s   内存限制:128 MB 最近,阿Q开了一间宠物收养所.收养 ...

  8. bzoj1208 [HNOI2004]宠物收养所(STL,Treap)

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5956  Solved: 2317[Submit][Sta ...

  9. BZOJ 1208: [HNOI2004]宠物收养所(BST)

    本来想先用set写一遍,再自己写个splay或treap,不过用set过了之后就懒得去写了....以后有空再来写吧..(不会有空的吧= = ------------------------------ ...

  10. BZOJ_1208_[HNOI2004]宠物收养所_SPLAY

    BZOJ_1208_[HNOI2004]宠物收养所_SPLAY Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望 ...

随机推荐

  1. Ajax ContentType 列表

    ".*"="application/octet-stream" ".001"="application/x-001" & ...

  2. Wmware Center安装过程记录

    前几天在服务器中安装了Vmware Esxi,以及在客户端中安装了Vmware Client,因此希望能够装一下Vmware vCenter Server试验一下,结果并不顺利,在此记录.   从官网 ...

  3. SpringMVC数据绑定全面示例(复杂对象,数组等)

    点击链接查询原文 http://www.xdemo.org/springmvc-data-bind/ 已经使用SpringMVC开发了几个项目,平时也有不少朋友问我数据怎么传输,怎么绑定之类的话题,今 ...

  4. 你所不知道的黑客工具之 EK 篇

    EK(Exploit kits)是指一套利用恶意软件感染用户电脑发起攻击的黑客工具,时下最著名的有 Angler EK.Fiesta EK.Hanjuan EK.Nuclear EK.Neutrino ...

  5. D&F学数据结构系列——二叉堆

    二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿 ...

  6. android音乐播放器开发教程

    android音乐播放器开发教程 Android扫描sd卡和系统文件 Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能 android操作sdcard中的多媒体文件——音乐列表 ...

  7. [shell编程]初识sed和gawk

    一.sed编辑器       shell脚本最常见的用途就是处理文本文件,sed和gawk能够极大的简化需要进行的数据处理任务.sed编辑器是流编辑器,跟普通交互式文本编辑器(如vim)不同.流编辑器 ...

  8. sublime text3 配置插件包记录

    前言: 很多插件已经开始放弃支持ST2了,所以推荐使用ST3,大量的最新插件和最新功能已经不再支持st2了. 下载地址戳这里:http://www.sublimetext.com/3 1.所有插件 易 ...

  9. Openflow的转发与传统的转发区别和优势

    来源:(SDN QQ群语录20130819) http://www.sdnap.com/sdnap-post/2411.html 山东同学-菜(Q群279796875) 21:40:21我是想问,op ...

  10. Eclipse 修改项目名称

    1:修改项目目录下:.project文件 <?xml version="1.0" encoding="UTF-8"?>               ...