题目

非常显然就是求一下距离每一个点曼哈顿距离最近的点和最远的点就好了

最远点非常好算,我们建完\(kd-tree\)之后直接暴力就好了

找最近点的时候会有这样一个问题,就是自己找到了自己

所以我们需要像线段树那样,做一个单点修改,找到那个点的位置,把那个点的坐标修改成\((inf,inf)\),之后再查询就好了

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {
char c=getchar();int x=0;while(c<'0'||x>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=1e5+5;
const int inf=600000005;
int mx[maxn][2],mi[maxn][2],id[maxn],l[maxn],r[maxn],fa[maxn],pos[maxn],Ans[maxn];
struct Point{int x[2],rk;}p[maxn],a[maxn];
int n,op,cnt,ans;
inline int cmp(Point A,Point B) {return A.x[op]<B.x[op];}
inline void pushup(int k) {
mx[k][0]=mi[k][0]=p[id[k]].x[0];
mx[k][1]=mi[k][1]=p[id[k]].x[1];
for(re int i=0;i<2;i++) {
if(l[k]) mx[k][i]=max(mx[k][i],mx[l[k]][i]),
mi[k][i]=min(mi[k][i],mi[l[k]][i]);
if(r[k]) mx[k][i]=max(mx[k][i],mx[r[k]][i]),
mi[k][i]=min(mi[k][i],mi[r[k]][i]);
}
}
int build(int x,int y,int o,int f) {
if(x>y) return 0;
int mid=x+y>>1,k=++cnt;
op=o,std::nth_element(p+x,p+mid,p+y+1,cmp);
id[k]=mid,pos[p[mid].rk]=k;fa[k]=f;
l[k]=build(x,mid-1,o^1,k),r[k]=build(mid+1,y,o^1,k);
pushup(k);return k;
}
inline int dis(Point A,Point B) {
return abs(A.x[0]-B.x[0])+abs(A.x[1]-B.x[1]);
}
inline int getmax(Point A,int k) {
int res=0;
for(re int i=0;i<2;i++) {
int a=abs(A.x[i]-mx[k][i]),b=abs(A.x[i]-mi[k][i]);
res+=max(a,b);
}
return res;
}
void ask(Point A,int k) {
int d=dis(A,p[id[k]]);
ans=max(ans,d);
int dl=-inf,dr=-inf;
if(l[k]) dl=getmax(A,l[k]);
if(r[k]) dr=getmax(A,r[k]);
if(dl>dr) {
if(dl>ans) ask(A,l[k]);
if(dr>ans) ask(A,r[k]);
}
else {
if(dr>ans) ask(A,r[k]);
if(dl>ans) ask(A,l[k]);
}
}
inline void change(int k,int x) {
id[k]=x;pushup(k);k=fa[k];
while(k) {pushup(k);k=fa[k];}
}
inline int getmin(Point A,int k) {
int res=0;
for(re int i=0;i<2;i++) {
if(A.x[i]>=mi[k][i]&&A.x[i]<=mx[k][i]) continue;
if(A.x[i]<mi[k][i]) res+=mi[k][i]-A.x[i];
else if(A.x[i]>mx[k][i]) res+=A.x[i]-mx[k][i];
}
return res;
}
void query(Point A,int k) {
int d=dis(A,p[id[k]]);
ans=min(ans,d);
int dl=inf,dr=inf;
if(l[k]) dl=getmin(A,l[k]);
if(r[k]) dr=getmin(A,r[k]);
if(dl<dr) {
if(dl<ans) query(A,l[k]);
if(dr<ans) query(A,r[k]);
}
else {
if(dr<ans) query(A,r[k]);
if(dl<ans) query(A,l[k]);
}
}
int main() {
n=read();
for(re int i=1;i<=n;i++) p[i].x[0]=read(),p[i].x[1]=read(),p[i].rk=i;
for(re int i=1;i<=n;i++) a[i]=p[i];
build(1,n,0,0);p[n+1].x[0]=p[n+1].x[1]=inf;
for(re int i=1;i<=n;i++)
ans=0,ask(a[i],1),Ans[i]=ans;
for(re int i=1;i<=n;i++) {
int pre=id[pos[i]];
change(pos[i],n+1);
ans=inf,query(a[i],1),Ans[i]-=ans;
change(pos[i],pre);
}
ans=inf;
for(re int i=1;i<=n;i++) ans=min(ans,Ans[i]);
printf("%d\n",ans);
return 0;
}

[SDOI2010]Hide and Seek的更多相关文章

  1. [BZOJ1941][Sdoi2010]Hide and Seek

    [BZOJ1941][Sdoi2010]Hide and Seek 试题描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他 ...

  2. bzoj:1941: [Sdoi2010]Hide and Seek

    1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec  Memory Limit: 162 MBSubmit: 531  Solved: 295[Submi ...

  3. 【BZOJ1941】[Sdoi2010]Hide and Seek KDtree

    [BZOJ1941][Sdoi2010]Hide and Seek Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了 ...

  4. BZOJ 1941: [Sdoi2010]Hide and Seek(k-d Tree)

    Time Limit: 16 Sec  Memory Limit: 162 MBSubmit: 1712  Solved: 932[Submit][Status][Discuss] Descripti ...

  5. 【bzoj1941】 Sdoi2010—Hide and Seek

    http://www.lydsy.com/JudgeOnline/problem.php?id=1941 (题目链接) 题意 给出n个二维平面上的点,求一点使到最远点的距离-最近点的距离最小. Sol ...

  6. 【kd-tree】bzoj1941 [Sdoi2010]Hide and Seek

    枚举每个点,计算离他最近的和最远的点. #include<cstdio> #include<cmath> #include<algorithm> using nam ...

  7. BZOJ1941:[SDOI2010]Hide and Seek(K-D Tree)

    Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏- ...

  8. bzoj 1941 [Sdoi2010]Hide and Seek——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1941 第二道KDtree! 枚举每个点,求出距离它的最远和最近距离.O( n * logn ...

  9. 【bzoj1941】[Sdoi2010]Hide and Seek KD-tree

    题目描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏. ...

随机推荐

  1. WebForm控件多字段绑定

    一.这里的多字段绑定是什么意思? 多字段绑定控件其实就是把两个字段显示在一起作为一个字段现在控件上! 可能读者看了可能还是有点懵逼,说的还是比较抽象!的确,光从这上面的确是无法具体到某特定一种情况!那 ...

  2. dynamic结合匿名类型 匿名对象传参

    首先说明下,我一般很少用dynamic关键字(类)的,因为毕竟是由反射实现的,所以对于性能方面还是吃亏不少(注:由于心里没底,查了一些资料得知,dynamic实质上好像不是由反射实现的,其性能也比直接 ...

  3. 我在项目中运用 IOC(依赖注入)--实战篇

    上一篇<我在项目中运用 IOC(依赖注入)--入门篇>只是简单的使用 IOC.实际项目使用 IOC 的情景复杂多了,比如说,构造函数有多个参数,有多个类继承同一个接口... Unity都有 ...

  4. SpringBoot(一)初遇

    环境: IDEA 2018.1.3 , jdk 1.8 , maven 3.3.9 零 第一次接触springboot, 如何学习比较困惑, 思前想后最后决定从文档来学习, 以下为学习中的参考资料: ...

  5. WIN2008服务器不能复制粘贴怎么办

    在任务管理器界面,选择进程,找到rdpclip.exe进程.   找到该进程后,点击结束进程.   然后点击WINDOWS任务管理器左上角的[文件]—[新建任务].   在编辑框内输入rdpclip. ...

  6. python中垃圾回收机制

    Python垃圾回收机制详解   一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题.在Python中,如果一个对象的引用数为0,Python虚拟 ...

  7. Git 学习之git 起步(一)

    起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作.读完本章,你就会明白为什么 Git ...

  8. cf1097D. Makoto and a Blackboard(期望dp)

    题意 题目链接 Sol 首先考虑当\(n = p^x\),其中\(p\)是质数,显然它的因子只有\(1, p, p^2, \dots p^x\)(最多logn个) 那么可以直接dp, 设\(f[i][ ...

  9. Path2.0中绚丽的的旋转菜单

    我们看一下实现的效果图: 在上图中,我将菜单弹出的效果设置成直线型,最终的弹出或汇总点在下面的红色按钮中. 它的实现原理是设置动画的同时并利用动画中的插入器(interpolator)来实现弹力.主要 ...

  10. maven 编译打包时,明明类文件没有问题,却提示错误:未结束的字符串字面值,maven-compiler-plugin:2.3.2

    maven错误提示如下: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (de ...