裸平衡树,恢复手感用的

//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.

最新文章

  1. Java演算法之堆排序(HeapSort)
  2. html5+Canvas实现酷炫的小游戏
  3. 【JVM】JVM之类加载器
  4. matlab 中randn randi rand randsrc的用法以及区别
  5. MySql、SqlServer、Oracle 三种数据库查询分页方式
  6. 朝花夕拾-android 一个注册新用户时,多步填写用户资料的框架
  7. javascript值和引用
  8. 启动httpd服务:SSLCertificateFile: file &#39;/var/www/miq/vmdb/certs/server.cer&#39; does not exist or is empty
  9. Windows Azure 微软公有云体验(一) 网站、SQL数据库、虚拟机
  10. EPEL库安装
  11. 微信公众平台Js API(WeixinApi)
  12. Spring Security验证流程剖析及自定义验证方法
  13. 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序,比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时
  14. Cocos2D v2.0至v3.x简洁转换指南(二)
  15. 《MySQL必知必会》读书笔记_4
  16. 安装并激活pycharm
  17. js和css实现手机横竖屏预览思路整理
  18. shell之实战应用一(查找xml文档中的关键字段)
  19. 4558: [JLoi2016]方
  20. Linux 各种运算符

热门文章

  1. Delphi实例之绘制正弦函数图像
  2. PAT——甲级1012:The Best Rank(有坑)
  3. DM8168通过GPMC接口与FPGA高速数据通信实现
  4. BZOJ 3925 ZJOI2015 地震后的幻想乡 状压dp+期望
  5. HDU 4744 Starloop System(最小费用最大流)(2013 ACM/ICPC Asia Regional Hangzhou Online)
  6. 完整Android开发基础入门博客专栏
  7. c# log
  8. lintcode-118-不同的子序列
  9. [GitHub] - Unity Timer
  10. codeforce580c (dfs)