bzoj 1208 HNOI2004宠物收养所 平衡树
2024-09-26 07:52:19
裸平衡树,恢复手感用的
//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.
最新文章
- Java演算法之堆排序(HeapSort)
- html5+Canvas实现酷炫的小游戏
- 【JVM】JVM之类加载器
- matlab 中randn randi rand randsrc的用法以及区别
- MySql、SqlServer、Oracle 三种数据库查询分页方式
- 朝花夕拾-android 一个注册新用户时,多步填写用户资料的框架
- javascript值和引用
- 启动httpd服务:SSLCertificateFile: file &#39;/var/www/miq/vmdb/certs/server.cer&#39; does not exist or is empty
- Windows Azure 微软公有云体验(一) 网站、SQL数据库、虚拟机
- EPEL库安装
- 微信公众平台Js API(WeixinApi)
- Spring Security验证流程剖析及自定义验证方法
- 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序,比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时
- Cocos2D v2.0至v3.x简洁转换指南(二)
- 《MySQL必知必会》读书笔记_4
- 安装并激活pycharm
- js和css实现手机横竖屏预览思路整理
- shell之实战应用一(查找xml文档中的关键字段)
- 4558: [JLoi2016]方
- Linux 各种运算符
热门文章
- Delphi实例之绘制正弦函数图像
- PAT——甲级1012:The Best Rank(有坑)
- DM8168通过GPMC接口与FPGA高速数据通信实现
- BZOJ 3925 ZJOI2015 地震后的幻想乡 状压dp+期望
- HDU 4744 Starloop System(最小费用最大流)(2013 ACM/ICPC Asia Regional Hangzhou Online)
- 完整Android开发基础入门博客专栏
- c# log
- lintcode-118-不同的子序列
- [GitHub] - Unity Timer
- codeforce580c (dfs)