题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1941

曼哈顿最小距离估价:max( 0, t[x].mn[i] - v.p[i] ) + max( 0, v.p[i] - t[x].mx[i] ),可理解为到边界;

曼哈顿最大距离估价:max( abs( t[x].mn[i] - v.p[i] ) + abs( t[x].mx[i] - v.p[i] ) ),可理解为到顶点;

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid ((l+r)>>1)
using namespace std;
int const xn=5e5+,inf=1e9;
int n,ans,rt,dm,cnt,c[xn][],mx,mn;
struct N{int mn[],mx[],p[],id;}a[xn],t[xn<<];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int Abs(int x){return x>?x:-x;}
int Min(int x,int y){return x<y?x:y;}
int Max(int x,int y){return x<y?y:x;}
bool cmp(N x,N y){return x.p[dm]<y.p[dm];}
void turn(int x,N v){for(int i=;i<;i++)t[x].mn[i]=t[x].mx[i]=t[x].p[i]=v.p[i];}
void pushup(int x)
{
int ls=c[x][],rs=c[x][];
for(int i=;i<;i++)
{
if(ls)t[x].mn[i]=Min(t[x].mn[i],t[ls].mn[i]),t[x].mx[i]=Max(t[x].mx[i],t[ls].mx[i]);
if(rs)t[x].mn[i]=Min(t[x].mn[i],t[rs].mn[i]),t[x].mx[i]=Max(t[x].mx[i],t[rs].mx[i]);
}
}
void build(int &x,int l,int r,int nw)
{
x=++cnt; dm=nw;
nth_element(a+l,a+mid,a+r+,cmp);
turn(x,a[mid]); t[x].id=mid;
if(mid>l)build(c[x][],l,mid-,nw^);
if(mid<r)build(c[x][],mid+,r,nw^);
pushup(x);
}
int dis(int x,N v)
{
int ret=;
for(int i=;i<;i++)
ret+=Max(Abs(t[x].mn[i]-v.p[i]),Abs(t[x].mx[i]-v.p[i]));
return ret;
}
void querymx(int x,N v)
{
mx=Max(mx,Abs(t[x].p[]-v.p[])+Abs(t[x].p[]-v.p[]));
int dl=(c[x][]?dis(c[x][],v):),dr=(c[x][]?dis(c[x][],v):);
if(dl>=dr){if(dl>mx)querymx(c[x][],v); if(dr>mx)querymx(c[x][],v);}
else {if(dr>mx)querymx(c[x][],v); if(dl>mx)querymx(c[x][],v);}
}
int dis2(int x,N v)
{
int ret=;
for(int i=;i<;i++)
ret+=Max(,t[x].mn[i]-v.p[i]),ret+=Max(,v.p[i]-t[x].mx[i]);
return ret;
}
void querymn(int x,N v,int q)
{
if(t[x].id!=q)mn=Min(mn,Abs(t[x].p[]-v.p[])+Abs(t[x].p[]-v.p[]));
int dl=(c[x][]?dis2(c[x][],v):inf),dr=(c[x][]?dis2(c[x][],v):inf);
if(dl<=dr){if(dl<mn)querymn(c[x][],v,q); if(dr<mn)querymn(c[x][],v,q);}
else {if(dr<mn)querymn(c[x][],v,q); if(dl<mn)querymn(c[x][],v,q);}
}
int main()
{
n=rd();
for(int i=;i<=n;i++)a[i].p[]=rd(),a[i].p[]=rd();
build(rt,,n,); ans=inf;
for(int i=;i<=n;i++)
{
mx=; mn=inf;
querymx(rt,a[i]); querymn(rt,a[i],i);
ans=Min(ans,mx-mn);
}
printf("%d\n",ans);
return ;
}

bzoj 1941 Hide and Seek —— K-D树的更多相关文章

  1. BZOJ - 1941 Hide and Seek (kd树)

    题目链接 kd树模板题,求二维空间上的最远点/最近点. 对所有点建立kd树,分别查询每个点即可.单次查询期望时间复杂度$O(logn)$ #include<bits/stdc++.h> u ...

  2. HDU 1941 Hide and Seek(离散化+树状数组)

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

  3. bzoj 1941 Hide and Seek

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

  4. 【BZOJ】【1941】【SDOI2010】Hide and Seek

    KD-Tree 一开始看错题了

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

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

  6. BZOJ 3402: [Usaco2009 Open]Hide and Seek 捉迷藏

    题目 3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec  Memory Limit: 128 MB Description     贝 ...

  7. 【BZOJ-1941】Hide and Seek KD-Tree

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

  8. [BZOJ1941][Sdoi2010]Hide and Seek

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

  9. 3402: [Usaco2009 Open]Hide and Seek 捉迷藏

    3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 78  Solved: 6 ...

随机推荐

  1. 11.Django数据库操作(查)

    django.db.models.query.QuerySet1.可迭代2.可切片 官方文档:https://docs.djangoproject.com/en/1.9/ref/models/quer ...

  2. dockerfile nginx配置

    Dockerfile 代码 From hub.c.163.com/public/nginx:1.2.1 RUN rm -v /etc/nginx/nginx.conf ADD nginx.conf / ...

  3. QT修改应用程序图标

    要准备一个ico的图标,必须是ico格式,切记!! 可以用png或者其他的在线转换:http://www.easyicon.net/covert/ 用记事本 新建文件icon.rc,内容为: IDI_ ...

  4. QMessageBox简单使用

    首先要调用 #include <QMessageBox> 然后 QMessageBox msgBox; msgBox.setWindowTitle("错误"); msg ...

  5. 关于随机浏览头伪装fake-UserAgent

    使用: from fake_useragent import UserAgent ua = UserAgent() #ie浏览器的user agent print(ua.ie) Mozilla/5.0 ...

  6. jQuery设计理念

    jQuery设计理念 引用百科的介绍: jQuery是继prototype之后又一个优秀的Javascript框架.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1. ...

  7. 2018svn1

    Svn(Subversion) VisualSVN-Server是SVN的服务端.TortoiseSVN是客户端.D:\SVNRepositories是安装VisualSVN-Server时候选择的仓 ...

  8. python 3 递归调用与二分法

    递归调用与二分法 1.递归调用 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身. 示例: def age(n): if n == 1: return 18 # 结束条件 return a ...

  9. 20165101 预备作业3 Linux安装及学习

    #Linux安装及命令入门 安装虚拟机 学习了娄老师的博客<基于VirtualBox虚拟机安装Ubuntu图文教程>,我下载了最新版的VirtualBox和16.04版的Ubuntu.根据 ...

  10. retry.RetryInvocationHandler (RetryInvocationHandler.java:invoke(140)) - Exception while invoking getFileInfo of class ClientNamenodeProtocolTranslatorPB over bdata236/192.168.1.236:9000 after 3 fail

    报错信息如下 -- ::, INFO [main]: retry.RetryInvocationHandler (RetryInvocationHandler.java:invoke()) - Exc ...