题目链接

kd树模板题,求二维空间上的最远点/最近点。

对所有点建立kd树,分别查询每个点即可。单次查询期望时间复杂度$O(logn)$

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+,inf=0x3f3f3f3f;
int n,ls[N],rs[N],mx[N][],mi[N][],rt,ans;
struct P {int x[];} a[N];
bool cmpx(P a,P b) {return a.x[]<b.x[];}
bool cmpy(P a,P b) {return a.x[]<b.x[];}
int dis(P a,P b) {return abs(a.x[]-b.x[])+abs(a.x[]-b.x[]);}
void pu(int u) {
for(int i=; i<; ++i) {
mx[u][i]=max(a[u].x[i],max(mx[ls[u]][i],mx[rs[u]][i]));
mi[u][i]=min(a[u].x[i],min(mi[ls[u]][i],mi[rs[u]][i]));
}
}
void build(int& u,int f=,int l=,int r=n) {
if(l>r) {u=; return;}
int mid=(l+r)>>;
u=mid;
if(l==r) {for(int i=; i<; ++i)mx[u][i]=mi[u][i]=a[u].x[i]; return;}
nth_element(a+l,a+mid,a+r+,!f?cmpx:cmpy);
build(ls[u],f^,l,mid-),build(rs[u],f^,mid+,r);
pu(u);
}
int maxd(P p,int u) {
int ret=;
for(int i=; i<; ++i)ret+=max(abs(p.x[i]-mx[u][i]),abs(p.x[i]-mi[u][i]));
return ret;
}
int mind(P p,int u) {
int ret=;
for(int i=; i<; ++i) {
if(mx[u][i]<p.x[i])ret+=p.x[i]-mx[u][i];
if(mi[u][i]>p.x[i])ret+=mi[u][i]-p.x[i];
}
return ret;
}
void qrymaxd(int t,int& x,int u=rt,int f=) {
if(u!=t)x=max(x,dis(a[t],a[u]));
int dl=,dr=;
if(ls[u])dl=maxd(a[t],ls[u]);
if(rs[u])dr=maxd(a[t],rs[u]);
if(dl>dr) {if(dl>x)qrymaxd(t,x,ls[u],f^); if(dr>x)qrymaxd(t,x,rs[u],f^);}
else {if(dr>x)qrymaxd(t,x,rs[u],f^); if(dl>x)qrymaxd(t,x,ls[u],f^);}
}
void qrymind(int t,int& x,int u=rt,int f=) {
if(u!=t)x=min(x,dis(a[t],a[u]));
int dl=inf,dr=inf;
if(ls[u])dl=mind(a[t],ls[u]);
if(rs[u])dr=mind(a[t],rs[u]);
if(dl<dr) {if(dl<x)qrymind(t,x,ls[u],f^); if(dr<x)qrymind(t,x,rs[u],f^);}
else {if(dr<x)qrymind(t,x,rs[u],f^); if(dl<x)qrymind(t,x,ls[u],f^);}
}
int main() {
mx[][]=mx[][]=~inf,mi[][]=mi[][]=inf;
scanf("%d",&n);
for(int i=; i<=n; ++i)scanf("%d%d",&a[i].x[],&a[i].x[]);
build(rt);
ans=inf;
for(int i=; i<=n; ++i) {
int mi=inf,mx=;
qrymaxd(i,mx),qrymind(i,mi);
ans=min(ans,mx-mi);
}
printf("%d\n",ans);
return ;
}

BZOJ - 1941 Hide and Seek (kd树)的更多相关文章

  1. bzoj 1941 Hide and Seek —— K-D树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1941 曼哈顿最小距离估价:max( 0, t[x].mn[i] - v.p[i] ) + m ...

  2. bzoj 1941 Hide and Seek

    题目大意: n个点,求每个点到其最远点距离-到其最近点距离(除自己之外)的最小值 思路: 对于估计函数的理解还不够深刻 #include<iostream> #include<cst ...

  3. bzoj 2648 SJY摆棋子 kd树

    题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...

  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. HDU 1941 Hide and Seek(离散化+树状数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1941 题意:给出平面上n个点,找出一点p,使得距离p最近和最远的点的距离之差最小.输出这 ...

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

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

  7. BZOJ 4066 简单题(KD树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4066 [题目大意] 要求维护矩阵内格子加点和矩阵查询 [题解] 往KD树上加权值点,支 ...

  8. bzoj 2648 SJY摆棋子 —— K-D树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 学习资料:https://blog.csdn.net/zhl30041839/arti ...

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

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

随机推荐

  1. make cmake catkin_make

    在Linux下进行C语言编程,必然要采用GNU GCC来编译C源代码生成可执行程序. 一.GCC快速入门 Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] [目标文件] 其中,目标文件 ...

  2. 手动创建sql数据表

    createtable  tb (    ID   int IDENTITY (1,1)     notnull, --创建列ID,并且每次新增一条记录就会加1    WokNo            ...

  3. Nginx 域名跳转

    域名跳转 就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 . 域名跳转配置 1.多域名指定一个域名重定向 # 空格分割域名 ...

  4. <nginx+PHP>nginx环境下配置支持php7

    [root@redhat7 ~]# wget http://am1.php.net/get/php-7.1.2.tar.gz/from/this/mirror [root@redhat7 ~]# ta ...

  5. Python-GUI编程-PyQt5

    Python-GUI编程-PyQt5 1. GUI编程是什么? GUI 全称为: Graphical User Interface;简称GUI翻译为中文为: 图形化用户接口简单理解就是:- 使用Pyt ...

  6. 安装MySQL 5.6

    记录安装mysql 5.6的全过程 下载安装包(尝试过使用mysql的yum源去安装--如果你的网络够好的话...) 注:我的系统是Centos 7.2的 如下,根据自己的需求去下载 CentOS L ...

  7. Linux系统下wget命令的使用教程

    一.Linux wget简介 wget是linux上的命令行的下载工具.这是一个GPL许可证下的自由软件.Linux wget支持HTTP和FTP协议,支持代理服务器和断点续传功能,能够自动递归远程主 ...

  8. ThinkPHP开发博客系统笔记之二

    1. 登陆验证码 当用户登陆的时候我们希望也弹出验证码,有两种方法可以实现:一是再增加一个弹出验证码的dialog,二是和注册共用一个验证码dialog.第一种方法有大量重复代码,所以我们使用第二种方 ...

  9. 超详细 Linux 下编译安装Redis 以及php配套使用

    一.Linux 下安装Redis 下载地址:http://redis.io/download,下载最新文档版本. 把鼠标移到上图的绿色框上,就会显示下图提示:(直接右键复制链接就好) 本教程使用的旧版 ...

  10. Effective C++ 条款11:在operator=中处理"自我赋值"

    "自我赋值"发生在对象被赋值给自己时: class Widget { ... }; Widget w; ... w = w; // 赋值给自己 a[i] = a[j]; // 潜在 ...