bzoj 1208 HNOI2004宠物收养所 平衡树
裸平衡树,恢复手感用的
//By BLADEVIL
var
n :longint;
i :longint;
x, y :longint;
t, tot :longint;
key, s, left, right :array[..] of longint;
ft :longint;
a, b :longint;
ans :longint; procedure right_rotate(var t:longint);
var
k :longint;
begin
k:=left[t];
left[t]:=right[k];
right[k]:=t;
s[k]:=s[t];
s[t]:=s[left[t]]+s[right[t]]+;
t:=k;
end; procedure left_rotate(var t:longint);
var
k :longint;
begin
k:=right[t];
right[t]:=left[k];
left[k]:=t;
s[k]:=s[t];
s[t]:=s[left[t]]+s[right[t]]+;
t:=k;
end; procedure maintain(var t:longint;flag:boolean);
begin
if not flag then
if s[left[left[t]]]>s[right[t]] then
right_rotate(t) else
if s[right[left[t]]]>s[right[t]] then
begin
left_rotate(left[t]);
right_rotate(t);
end else exit
else
if s[right[right[t]]]>s[left[t]] then
left_rotate(t) else
if s[left[right[t]]]>s[left[t]] then
begin
right_rotate(right[t]);
left_rotate(t);
end else exit;
maintain(left[t],false);
maintain(right[t],true);
maintain(t,true);
maintain(t,false);
end; procedure insert(var t:longint; v:longint);
begin
if t= then
begin
inc(tot);
t:=tot;
key[t]:=v;
s[t]:=;
left[t]:=;
right[t]:=;
end else
begin
inc(s[t]);
if v<key[t] then insert(left[t],v) else insert(right[t],v);
maintain(t,v>=key[t]);
end;
end; function delete(var t:longint; v:longint):longint;
begin
dec(s[t]);
if (v=key[t]) or (v<key[t]) and (left[t]=) or (v>key[t]) and (right[t]=) then
begin
delete:=key[t];
if (left[t]=) or (right[t]=) then
t:=left[t]+right[t] else
key[t]:=delete(left[t],key[t]+);
end else
if v<key[t] then delete:=delete(left[t],v) else delete:=delete(right[t],v);
end; function pre(var t:longint; v:longint):longint;
begin
if t= then exit(-);
if v<key[t] then pre:=pre(left[t],v) else
begin
pre:=pre(right[t],v);
if pre=- then pre:=key[t];
end;
end; function succ(var t:longint; v:longint):longint;
begin
if t= then exit(-);
if key[t]<=v then succ:=succ(right[t],v) else
begin
succ:=succ(left[t],v);
if succ=- then succ:=key[t];
end;
end; begin
read(n);
ans:=;
t:=; tot:=; s[t]:=; for i:= to n do
begin
read(x,y);
if x=ft then insert(t,y) else
if s[t]= then
begin
ft:=x;
insert(t,y);
end else
begin
a:=pre(t,y); b:=succ(t,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(t,b);
end else
begin
ans:=(ans+abs(y-a)) mod ;
a:=delete(t,a);
end;
end;
end;
writeln(ans); end.
bzoj 1208 HNOI2004宠物收养所 平衡树的更多相关文章
- 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 ...
- BZOJ 1208: [HNOI2004]宠物收养所(BST)
本来想先用set写一遍,再自己写个splay或treap,不过用set过了之后就懒得去写了....以后有空再来写吧..(不会有空的吧= = ------------------------------ ...
- bzoj 1208: [HNOI2004]宠物收养所 (Treap)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1208 题面: 1208: [HNOI2004]宠物收养所 Time Limit: 10 ...
- BZOJ 1208: [HNOI2004]宠物收养所 SET的妙用
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4902 Solved: 1879 题目连接 http:/ ...
- Bzoj 1208: [HNOI2004]宠物收养所(splay)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收 ...
- BZOJ 1208 [HNOI2004]宠物收养所:Splay(伸展树)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1208 题意: 有一个宠物收养所,在接下来一段时间内会陆续有一些宠物进到店里,或是一些人来领 ...
- BZOJ 1208 [HNOI2004]宠物收养所 | SPlay模板题
题目: 洛谷也能评 题解: 记录一下当前树维护是宠物还是人,用Splay维护插入和删除. 对于任何一次询问操作都求一下value的前驱和后继(这里前驱和后继是可以和value相等的),比较哪个差值绝对 ...
- 1208: [HNOI2004]宠物收养所
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 12030 Solved: 4916 Description ...
随机推荐
- 深入Python的类和对象
多态:不同的子类对象,可以调用相同的父类方法,通过改写父类的方法,产生不同的执行结果 instance和type的区别: instance能够顺延到父类,比对对象与父类是否类型一致.而type只能比对 ...
- Assetbundle2
Assetbundle可以将Prefab封装起来,这是多么方便啊! 而且我也强烈建议大家将Prefab封装成Assetbundle,因为Prefab可以将游戏对象身上带的游戏游戏组件.游戏脚本.材质都 ...
- 07-Mysql数据库----数据类型
介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考链接:http://www.runoob.com/mysql/mysql-data- ...
- 在阿里云上遇见更好的Oracle(一)
2003年毕业那年正好遇上非典,好不容易找到一份制造工厂的工作,凭着一点点的SQL基础进入了IT部门,在那里第一次听说了Oracle.在此之前,我对数据库的认知基本还停留在Access阶段,耳闻过一点 ...
- Python 把两个列表遍历为一个
两个list, 有对应关系,希望同时完成遍历 用迭代器迭代的方法也不是不可以,python提供了更直观的方法: 可以使用zip把两个list打包 , 类似: list1 = [1,2,3,4] lis ...
- java编程思想 内容总结
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面 试过程中,而且 ...
- php+Mysql 页面登录代码
登录界面设置: <?php/** * Created by xx. * User: msi * Date: 2017/10/26 * Time: 18:12 *///session每次用之前都要 ...
- 浅谈C#中show和showDialog的区别
[转载] A.WinForm中窗体显示 显示窗体可以有以下2种方法: Form.ShowDialog方法 (窗体显示为模式窗体) Form.Show方法 (窗体显示为无模式窗体) 2者具体区别如 ...
- linux基本操作2
将当前用户目录下的文件清单输出到文件list1.txt(当前用户目录下)中ls -l > list1.txt 利用管道命令将根(/)下所有修改日期在4月16日的文件清单输出到list2.txt( ...
- Web-Servlet处理表单