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] ) + 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树的更多相关文章
- BZOJ - 1941 Hide and Seek (kd树)
题目链接 kd树模板题,求二维空间上的最远点/最近点. 对所有点建立kd树,分别查询每个点即可.单次查询期望时间复杂度$O(logn)$ #include<bits/stdc++.h> u ...
- HDU 1941 Hide and Seek(离散化+树状数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1941 题意:给出平面上n个点,找出一点p,使得距离p最近和最远的点的距离之差最小.输出这 ...
- bzoj 1941 Hide and Seek
题目大意: n个点,求每个点到其最远点距离-到其最近点距离(除自己之外)的最小值 思路: 对于估计函数的理解还不够深刻 #include<iostream> #include<cst ...
- 【BZOJ】【1941】【SDOI2010】Hide and Seek
KD-Tree 一开始看错题了
- bzoj:1941: [Sdoi2010]Hide and Seek
1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 531 Solved: 295[Submi ...
- BZOJ 3402: [Usaco2009 Open]Hide and Seek 捉迷藏
题目 3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec Memory Limit: 128 MB Description 贝 ...
- 【BZOJ-1941】Hide and Seek KD-Tree
1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 830 Solved: 455[Submi ...
- [BZOJ1941][Sdoi2010]Hide and Seek
[BZOJ1941][Sdoi2010]Hide and Seek 试题描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他 ...
- 3402: [Usaco2009 Open]Hide and Seek 捉迷藏
3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 78 Solved: 6 ...
随机推荐
- Eight(经典题,八数码)
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- D - Invitation Cards
D - Invitation Cards Time Limit:8000MS Memory Limit:262144KB 64bit IO Format:%lld & %llu ...
- docker笔记一
docker概念介绍: docker 是一个装在linux上的普通的软件.利用docker的命令,可以创建一个带有linux操作系统的镜像文件,docker命令运行这个带的linux操作系的镜像文件, ...
- 牛人blog汇总
1.天一思维: https://blog.csdn.net/tszty1997?t=1
- bash编程基础
bash变量 变量命名: 1.不能使用程序中的关键字(保留字) 2.只能使用数字.字母和下划线,且不能以数字开头 3.要见名知义 变量类型: 数值型:精确数值(整数),近似数值(浮点型) 字符型:ch ...
- memcpy使用
void memcpy(void dest, const void *src, size_t n); 功能编辑 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置 ...
- 如何写PHP规范注释
所有的文档标记都是在每一行的 * 后面以@开头.如果在一段话的中间出来@的标记,这个标记将会被当做普通内容而被忽略掉. @access 该标记用于指明关键字的存取权限:private.p ...
- 通过tile和url判断页面跳转是否正确
通过webdriver中的.title和.current_url获取title和url from time import sleep from selenium import webdriver br ...
- 20145229吴姗珊 《Java程序设计》第4周学习总结
20145229吴姗珊 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 6.1继承共同行为 1.继承基本上就是避免多个类间重复定义共同行为 简单的类的定义 使用s ...
- Android系统Recovery工作原理之使用update.zip升级过程分析(一)---update.zip包的制作【转】
本文转载自:http://blog.csdn.net/mu0206mu/article/details/7399822 这篇及以后的篇幅将通过分析update.zip包在具体Android系统升级的过 ...