BZOJ - 1941 Hide and Seek (kd树)
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树)的更多相关文章
- 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 ...
- bzoj 1941 Hide and Seek
题目大意: n个点,求每个点到其最远点距离-到其最近点距离(除自己之外)的最小值 思路: 对于估计函数的理解还不够深刻 #include<iostream> #include<cst ...
- bzoj 2648 SJY摆棋子 kd树
题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...
- BZOJ 1941: [Sdoi2010]Hide and Seek(k-d Tree)
Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 1712 Solved: 932[Submit][Status][Discuss] Descripti ...
- HDU 1941 Hide and Seek(离散化+树状数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1941 题意:给出平面上n个点,找出一点p,使得距离p最近和最远的点的距离之差最小.输出这 ...
- BZOJ1941:[SDOI2010]Hide and Seek(K-D Tree)
Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏- ...
- BZOJ 4066 简单题(KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4066 [题目大意] 要求维护矩阵内格子加点和矩阵查询 [题解] 往KD树上加权值点,支 ...
- bzoj 2648 SJY摆棋子 —— K-D树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 学习资料:https://blog.csdn.net/zhl30041839/arti ...
- bzoj:1941: [Sdoi2010]Hide and Seek
1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 531 Solved: 295[Submi ...
随机推荐
- maven项目中如何创建web.xml
在web工程创建时创建web.xml:用Eclipse新建一个web项目没有自动生成web.xml 在创建maven工程时,大多没有创建web.xml文件,web.xml路径:src/main/web ...
- Visual Studio各版本区别
Visual Studio 是微软公司推出的开发环境,Visual Studio 可以用来创建 Windows 平台下的 Windows 应用程序和网络应用程序,也可以用来创建网络服务.智能设备应用程 ...
- 20145235李涛《网络对抗》Exp9 Web安全基础实践
基础问答 SQL注入攻击原理,如何防御? SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的. 对于SQL注入攻击的防范 ...
- Spring Boot 快速入门(IDEA)
从字面理解,Boot是引导的意思,因此SpringBoot帮助开发者快速搭建Spring框架:SpringBoot帮助开发者快速启动一个Web容器:SpringBoot继承了原有Spring框架的优秀 ...
- 使用axis2构建webservice
axis2是可以实现webservice的一个插件,使用这个插件可以发布webservice 1:可以使用这个插件来发布webservice,可以看网址:http://clq9761.iteye.co ...
- jvm-知识点总结
参考: https://blog.csdn.net/wuqinghai2012/article/details/51485414 http://pengjiaheng.iteye.com/blog/5 ...
- quartz(7)-源码分析
定时器启动 上图通过spring加载quartz <bean id="scheduler" class="org.springframework.schedulin ...
- ElasticSearch性能优化
一.搜索效率优化 批量提交 当有大量数据提交的时候,建议采用批量提交. 比如在做 ELK 过程中 ,Logstash indexer 提交数据到 Elasticsearch 中 ,batch size ...
- CocoaPods学习系列4——进阶用法
这篇文章,记录一下CocoaPods的进阶用法. 进阶用法主要体现在.podspec文件和Podfile的配置上. .podspec文件的进阶配置 以官方的一个.podspec文件示例细说: Pod: ...
- scala学习手记5 - 元组与多重赋值
假定要在一个方法中返回多个值.比如需要返回一个人的名.姓和邮箱地址.在Java中最常用的方法是定义一个Person类,其中包括相对应的字段:还有些不常用的方法就是返回一个集合或数组,拿到结果后再进行循 ...