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. 一个完整openlayer的例子,包括marker,popup等

    整理转自:http://www.blogjava.net/siriusfx/archive/2007/11/26/163104.html openlayers提供了几十个示例,虽然每个示例都很简单,但 ...

  2. 【BZOJ】【2132】圈地计划

    网络流/最小割 Orz Hzwer 这类大概是最小割建模中的经典应用吧…… 黑白染色,然后反转黑色的技巧感觉很巧妙!这个转化太神奇了…… /****************************** ...

  3. 关于StringBuilder

    写在前面的话 很久没有更新博客了,来上海实习身边的一切波动挺大的,还好我走过来了,博客园:一路有你! StringBuilder 相信大家对StringBuilder类型一定不陌生,我们Coding经 ...

  4. Properties --- C++读配置信息的类

    http://blog.csdn.net/billow_zhang/article/details/4304980 在开发实践中,积累了一些通用的C++ 类库,在此写出来给大家分享.也希望能给出更好的 ...

  5. 终于明白公测的beta 源自何处了

    A very early version of a software product that may not contain all of the features that are planned ...

  6. AIZU 0005

    GCD and LCM Time Limit : 1 sec, Memory Limit : 65536 KB Japanese version is here GCD and LCM Write a ...

  7. 内存对齐-C语言struct内存占用问题

    转1个写的比较全面的. http://hubingforever.blog.163.com/blog/static/17104057920122256134681/ 本文编辑整理自:http://hi ...

  8. no such partition grub rescue>

    事出有因: 电脑系统是win7+ubuntu,然后在win7下把ubuntu的分区给删除了,重启,出现 no such partition grub rescue> 错误. 原因是双系统之前是由 ...

  9. [wikioi]线段树练习 2

    http://codevs.cn/problem/1081/ #include <vector> #include <iostream> #include <string ...

  10. linux 线程的内核栈是独立的还是共享父进程的?

    需要考证 考证结果: 其内核栈是独立的 206 static struct task_struct *dup_task_struct(struct task_struct *orig) 207 { 2 ...