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. php发送get、post请求的几种方法

    方法1: 用file_get_contents 以get方式获取内容 <?php $url='http://www.domain.com/'; $html = file_get_contents ...

  2. Wireshark - ICMP 报文分析

    1. 测试机器,源 IP 地址为 10.21.28.110,目的 IP 地址为 10.6.0.24. 2. 使用 "ip.addr == 10.6.0.24 and icmp" 过 ...

  3. JavaScript string array 数组

    Array类可以如下定义: var aValues = new Array(); 如果预先知道数组的长度,可以用参数传递长度 var aValues = new Array(20); -------- ...

  4. UVA 10720 Graph Construction 贪心+优先队列

    题目链接: 题目 Graph Construction Time limit: 3.000 seconds 问题描述 Graph is a collection of edges E and vert ...

  5. 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  6. hdu 1180 诡异的楼梯(广搜,简单)

    题目 挺简单的一道广搜题,只要用判断时间是偶数还是奇数就可以判断楼梯的方位,但是我这傻逼居然写了那么久啊那么久,我果然秀逗了,,,, #define _CRT_SECURE_NO_WARNINGS # ...

  7. mac下安装mysql 连接时候报错 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

    http://segmentfault.com/q/1010000000094608 同样的问题,先在网上搜了下其他人解决这个问题的方法,是去修改mysql.cnf文件添加mysql.sock文件路径 ...

  8. TYVJ P1016 装箱问题

    P1016 装箱问题 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 太原成成中学第2次模拟赛 第三道 描述 有一个箱子容量为v(正整数,o≤v≤20000) ...

  9. 教育行业SaaS选型 需要注意的三点问题

    2008年经济危机席卷全球,造成世界范围内的金融动荡,国内各行业虽然都面临了不小的冲击,但是在危机面前,中国的教育行业却逆势而上,硕果累累.据统计,2008年教育行业的投资案例达18起,投资金额18. ...

  10. Tomcat部署Web应用方法总结

    转载:http://m.blog.csdn.net/blog/u012516903/15741727 Tomcat部署Web应用方法总结 在Tomcat中部署Java Web应用程序有两种方式:静态部 ...