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 ...
随机推荐
- OWASP-A5-安全配置错误
1.安全配置错误 安全配置错误可以发生在一个应用程序堆栈的任何层面,包括平台.Web服务器.应用服务器.数据库.框架和自定义代码. 开发人员和系统管理员需共同努力,以确保整个堆栈的正确配置.自动扫描器 ...
- 像使用linux一样使用mac
1 不能像使用windows一样使用mac 因为mac卸载不方便. 2 gcc的问题 就使用系统默认的gcc,即clang,要想使用原声的gcc是不行的,mac本身不支持.
- 13.Django模版
没什么好说的,看官方文档 https://docs.djangoproject.com/en/1.9/ref/templates/builtins/
- Cordova 教程 学习步骤-从零基础开始
Cordova的技术交流新群
- Javaweb基础--->利用监听器统计在线用户数量和用户信息
首页布局:index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- nginx服务
nginx服务 一.nginx安装 1.yum安装:yum -y install nginx 注:centos 7中yum安装nginx前需要先安装 epel-release 2.源码包安装 安装之 ...
- CentOS 6.5 下安装配置GO 1.2.1
步骤1:保持联网状态,命令 # wget http://go.googlecode.com/files/go1.2.linux-amd64.tar.gz 这里下载的是64位,wget这里默认下载到当前 ...
- 用Java实现断点续传的基本思路和代码
用Java实现断点续传的基本思路和代码 URL url = new URL(http://www.oschina.net/no-exist.zip); HttpURLConnection http ...
- 经典c语言题
1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 2. 写一个“标 ...
- 每天一个Linux命令(26)chown命令
chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组. (1)用法: 用法: chown [选项 ...