2013-09-21 16:50

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

wiki1285的更多相关文章

随机推荐

  1. 「题目代码」P1013~P1017(Java)

    1013 C基础-求偶数和 import java.util.*; import java.io.*; import java.math.BigInteger; public class Main { ...

  2. 《python核心编程第二版》第1章练习

    1–1. 安装 Python.请检查 Python 是否已经安装到你的系统上,如果没有,请下载并 安装它 略 1–2.  执行 Python.有多少种运行 Python 的不同方法?你喜欢哪一种?为什 ...

  3. Sping工作原理

    一. IoC(Inversion of control): 控制反转 1.IoC: 概念:控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 核心:bean工厂:在Sp ...

  4. BZOJ 4031 HEOI2015 小Z的房间 基尔霍夫矩阵+行列式+高斯消元 (附带行列式小结)

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可 ...

  5. 使用github同步网站

    今天刚刚完成了自己的一个小项目,想把他上传到服务器上,想到到我使用的Visual Stdio Code具有git功能,于是想到使用github作为代码仓库来同步代码. 大体步骤分为这几步:创建远程代码 ...

  6. asp.net文件上传进度条研究

    文章:asp.net 文件上传进度条实现代码

  7. intelliJ idea 使用技巧&方法

    导入的项目查看svn地址:在项目上右键--subversion--relocate可以看到以前对应的svn地址. 重要的几个快捷键的使用方式: (1)       alt+insert 成员变量封装 ...

  8. php实现base64图片上传方式实例代码

    <?php /** * base64图片上传 * @param $base64_img * @return array */ header("content-type:text/htm ...

  9. 一个python游戏源码

    #finalPyPong.py import pygame,sys class MyBallClass(pygame.sprite.Sprite): def __init__(self,image_f ...

  10. [LeetCode] 56. Merge Intervals(vector sort)

    /** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0 ...