wiki1285
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的更多相关文章
随机推荐
- CDateTimeUI类源码分析
CDateTimeUI是duilib里选择日期的控件,继承于CLabelUI控件,用于记录已经选择的日期,选择控件则是调用win32的日期选择控件. CDateTimeUI包含两个类,一个是CDate ...
- adb常用命令(手机测试)
ADB安装与常用命令详解 一.ADB意义 adb的全称为Android Debug Bridge,就是起到 ...
- python接口测试(一)——http请求及token获取
使用python对当前的接口进行简单的测试 1.接口测试是针对软件对外提供服务得接口得输入输出进行得测试,验证接口功能与接口描述文档得一致性 返回结果可以为字符串,json,xml等 2.接口的请求方 ...
- Jmeter从文件中读取参数值
1. 通过函数助手,从本地文件中取值选项->函数助手对话框->选择__CSVRead函数->调用参数其中,函数助手对话框中,第一栏填写本地文件所在地址,第二栏写需要入参的值,有点类似 ...
- Laxcus大数据分布计算演示实例
Laxcus大数据管理系统提供了基于Diffuse/Converge分布算法的计算能力.算法的具体介绍详见<Laxcus:大数据处理系统>一文.本图展示了在集群环境下的随机数产生.排序.显 ...
- 树莓派搭建 Hexo 博客(二)
Hexo 一个开源的博客框架,本文记录了一下在树莓派上搭建 Hexo 博客的过程. 上一篇介绍了 Hexo 的配置,现在网站已经能在本地访问了,也能通过 hexo generate 命令生成静态界面 ...
- windows下git hub的GUI软件配置与使用
转载自:http://www.cnblogs.com/haore147/p/3618930.html 1. 安装两个软件 1 2 1. git的命令行程序--git for windows:htt ...
- 程序运行bug查看
1.左击计算机进入管理,点击windows日志,查看程序信息. 可以方便看到报错信息.
- JVM高级内存优化面试
Sun HotSpot VM,是JDK和Open JDK中自带的虚拟机,也是目前使用范围最广的Java虚拟机. JVM内存分布程序计数器:是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指 ...
- lintcode-96-链表划分
96-链表划分 给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前. 你应该保留两部分内链表节点原有的相对顺序. 样例 给定链表 1->4->3->2-&g ...