Description

小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏。 但是,他们觉得,玩普通的捉迷藏没什么意思,还是不够寂寞,于是,他们决定玩寂寞无比的螃蟹版捉迷藏,顾名思义,就是说他们在玩游戏的时候只能沿水平或垂直方向走。一番寂寞的剪刀石头布后,他们决定iPig去捉giPi。由于他们都很熟悉PKU的地形了,所以giPi只会躲在PKU内n个隐秘地点,显然iPig也只会在那n个地点内找giPi。游戏一开始,他们选定一个地点,iPig保持不动,然后giPi用30秒的时间逃离现场(显然,giPi不会呆在原地)。然后iPig会随机地去找giPi,直到找到为止。由于iPig很懒,所以他到总是走最短的路径,而且,他选择起始点不是随便选的,他想找一个地点,使得该地点到最远的地点和最近的地点的距离差最小。iPig现在想知道这个距离差最小是多少。 由于iPig现在手上没有电脑,所以不能编程解决这个如此简单的问题,所以他马上打了个电话,要求你帮他解决这个问题。iPig告诉了你PKU的n个隐秘地点的坐标,请你编程求出iPig的问题。

Input

第一行输入一个整数N 第2~N+1行,每行两个整数X,Y,表示第i个地点的坐标

Output

一个整数,为距离差的最小值。

建立k-d树,枚举每个点查询最近点和最远点的曼哈顿距离。

单次查询最坏时间复杂度O(n0.5)但通常不会达到。

#include<cstdio>
#include<algorithm>
#define inf 2147483647
inline int abs(int x){return x>?x:-x;}
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
inline void maxs(int&x,int y){if(x<y)x=y;}
inline void mins(int&x,int y){if(x>y)x=y;}
inline int max0(int x){return x>?x:;}
struct pos{
int x,y;
};
struct node{
int x1,y1,x2,y2;
int xm,ym;
int l,r;
node():x1(inf),y1(inf),x2(-inf),y2(-inf){}
inline void set(int x,int y){
x1=x2=xm=x;
y1=y2=ym=y;
}
};
int dx=;
bool operator<(pos a,pos b){
if(dx)return a.x<b.x;
return a.y<b.y;
}
node ns[];
pos ps[];
int np=,n;
int X,Y,minv,maxv,ans(inf);
int build(int l,int r,int d=){
if(l==r)return ;
dx=d;
int m=l+r>>;
node&w=ns[np++];
std::nth_element(ps+l,ps+m,ps+r);
w.set(ps[m].x,ps[m].y);
d^=;
w.l=build(l,m,d);
mins(w.x1,ns[w.l].x1);
mins(w.y1,ns[w.l].y1);
maxs(w.x2,ns[w.l].x2);
maxs(w.y2,ns[w.l].y2);
w.r=build(m+,r,d);
mins(w.x1,ns[w.r].x1);
mins(w.y1,ns[w.r].y1);
maxs(w.x2,ns[w.r].x2);
maxs(w.y2,ns[w.r].y2);
return &w-ns;
}
inline int maxd(int v){
if(!v)return ;
node&w=ns[v];
return max0(X-w.x1)+max0(w.x2-X)+max0(Y-w.y1)+max0(w.y2-Y);
}
inline int mind(int v){
if(!v)return inf;
node&w=ns[v];
return max0(X-w.x2)+max0(w.x1-X)+max0(Y-w.y2)+max0(w.y1-Y);
}
void nt(int v=){
node&w=ns[v];
int a=abs(X-w.xm)+abs(Y-w.ym);
if(a)mins(minv,a);
int ld=mind(w.l);
int rd=mind(w.r);
if(ld<rd){
if(ld<minv)nt(w.l);
if(rd<minv)nt(w.r);
}else{
if(rd<minv)nt(w.r);
if(ld<minv)nt(w.l);
}
}
void ft(int v=){
node&w=ns[v];
int a=abs(X-w.xm)+abs(Y-w.ym);
if(a)maxs(maxv,a);
int ld=maxd(w.l);
int rd=maxd(w.r);
if(ld>rd){
if(ld>maxv)ft(w.l);
if(rd>maxv)ft(w.r);
}else{
if(rd>maxv)ft(w.r);
if(ld>maxv)ft(w.l);
}
}
inline int read(){
char c=getchar();
int x=;
while(c>''||c<'')c=getchar();
while(c>=''&&c<='')
x=x*+c-'',c=getchar();
return x;
}
int main(){
n=read();
for(int i=;i<n;i++)ps[i].x=read(),ps[i].y=read();
build(,n);
for(int i=;i<n;i++){
X=ps[i].x;Y=ps[i].y;
minv=inf;maxv=;
nt();
ft();
mins(ans,maxv-minv);
}
printf("%d",ans);
return ;
}

最新文章

  1. 机器学习之K-近邻算法
  2. SQLServer自动备份和自动删除过期文件
  3. 一行代码从表中选取N行到另一个表
  4. OGNL语言
  5. C++ 标准IO库
  6. &lt;C Traps and Pitfalls&gt;笔记
  7. Custom Sort Order
  8. light oj 1140 - How Many Zeroes? 数位DP
  9. cocos2d-x 2.0 序列帧动画 深入分析
  10. Asp.Net 之 母版页中对控件ID的处理
  11. 在.NET中使用iTextSharp创建/读取PDF报告: Part I [翻译]
  12. 【原创】leetCodeOj --- Largest Number 解题报告
  13. centos 系统上如何把python升级为3
  14. 安装.net 服务时出现0x80131515错误的解决办法
  15. Oracle date 详解
  16. ES之七:配置文件详解
  17. OAuth 2.0 Authorization Framework RFC
  18. OOP理解
  19. POJ2720 Last Digits
  20. 【FAQ】maven包引入版本引发的问题

热门文章

  1. 字符串 date 转标准 yyyyMMdd 格式
  2. os、os.path模块中关于文件、目录常用的函数使用方法
  3. Spring学习笔记之各个包的作用
  4. MyEclipse WebSphere开发教程:WebSphere 7安装指南(四)
  5. MySQL主从数据一致性检验
  6. poshytip漂亮的表单提示插件
  7. np.stack() 与 tf.stack() 的简单理解
  8. C语言基础:结构体 分类: iOS学习 c语言基础 2015-06-10 21:47 28人阅读 评论(0) 收藏
  9. HttpWebRequest.Connection的问题
  10. HDU 1233:还是畅通工程(最小生成树)