【BZOJ1941】Hide and Seek(KD-Tree)
【BZOJ1941】Hide and Seek(KD-Tree)
题面
题解
\(KD-Tree\)对于每个点搜一下最近点和最远点就好了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 555555
#define cmin(a,b) (a=(a>b?b:a));
#define cmax(a,b) (a=(a<b?b:a));
#define ls (t[o].ch[0])
#define rs (t[o].ch[1])
inline int read()
{
    RG int x=0,t=1;RG char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=-1,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return x*t;
}
struct Node{int d[2];}a[MAX];
int D;
bool operator<(Node a,Node b){return a.d[D]<b.d[D];}
struct KD_Node
{
	int mn[2],mx[2],ch[2];
	Node a;
}t[MAX];
int n,rt;
int mxd[MAX],mnd[MAX];
void pushup(int x,int y)
{
	cmin(t[x].mn[0],t[y].mn[0]);cmin(t[x].mn[1],t[y].mn[1]);
	cmax(t[x].mx[0],t[y].mx[0]);cmax(t[x].mx[1],t[y].mx[1]);
}
int Build(int l,int r,int nd)
{
	D=nd;int o=(l+r)>>1;
	nth_element(&a[l],&a[o],&a[r+1]);
	t[o].mn[0]=t[o].mx[0]=t[o].a.d[0]=a[o].d[0];
	t[o].mn[1]=t[o].mx[1]=t[o].a.d[1]=a[o].d[1];
	if(l<o)ls=Build(l,o-1,nd^1),pushup(o,ls);
	if(r>o)rs=Build(o+1,r,nd^1),pushup(o,rs);
	return o;
}
int Dis(Node a,Node b){return abs(a.d[0]-b.d[0])+abs(a.d[1]-b.d[1]);}
int min_Dis(Node a,KD_Node t)
{
	return max(t.mn[0]-a.d[0],0)+max(a.d[0]-t.mx[0],0)+max(t.mn[1]-a.d[1],0)+max(a.d[1]-t.mx[1],0);
}
int max_Dis(Node a,KD_Node t)
{
	return max(abs(a.d[0]-t.mn[0]),abs(a.d[0]-t.mx[0]))+max(abs(a.d[1]-t.mn[1]),abs(a.d[1]-t.mx[1]));
}
int Ans,Min,Max;
void Query_mn(int o,Node a)
{
	int tmp=Dis(a,t[o].a),d[2];
	if(tmp)cmin(Min,tmp);
	if(ls)d[0]=min_Dis(a,t[ls]);else d[0]=1e9;
	if(rs)d[1]=min_Dis(a,t[rs]);else d[1]=1e9;
	tmp=d[0]>=d[1];
	if(d[tmp]<Min)Query_mn(t[o].ch[tmp],a);tmp^=1;
	if(d[tmp]<Min)Query_mn(t[o].ch[tmp],a);tmp^=1;
}
void Query_mx(int o,Node a)
{
	if(Max-Min>=Ans)return;
	int tmp=Dis(a,t[o].a),d[2];
	if(tmp)cmax(Max,tmp);
	if(ls)d[0]=max_Dis(a,t[ls]);else d[0]=0;
	if(rs)d[1]=max_Dis(a,t[rs]);else d[1]=0;
	tmp=d[0]<=d[1];
	if(d[tmp]>Max)Query_mx(t[o].ch[tmp],a);tmp^=1;
	if(d[tmp]>Max)Query_mx(t[o].ch[tmp],a);tmp^=1;
}
int main()
{
	n=read();
	for(int i=1;i<=n;++i)a[i].d[0]=read(),a[i].d[1]=read();
	rt=Build(1,n,0);Ans=1e9;
	for(int i=1;i<=n;++i)
	{
		Min=1e9;Query_mn(rt,a[i]);
		Max=000;Query_mx(rt,a[i]);
		Ans=min(Ans,Max-Min);
	}
	printf("%d\n",Ans);
	return 0;
}
												
											【BZOJ1941】Hide and Seek(KD-Tree)的更多相关文章
- 【BZOJ2002】弹飞绵羊(Link-Cut Tree)
		
[BZOJ2002]弹飞绵羊(Link-Cut Tree) 题面 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lost ...
 - 【CF1172E】Nauuo and ODT(Link-Cut Tree)
		
[CF1172E]Nauuo and ODT(Link-Cut Tree) 题面 CF 给你一棵树,每个节点有一个颜色. 定义一条路径的权值为路径上不同颜色的数量.求所有有向路径的权值和. 有\(m\ ...
 - 【BZOJ-1941】Hide and Seek      KD-Tree
		
1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 830 Solved: 455[Submi ...
 - 【MySQL】索引的本质(B+Tree)解析
		
索引是帮助MySQL高效获取数据的排好序的数据结构. 索引数据结构 二叉树 红黑树 Hash表 B-Tree MySQL所使用为B+Tree (B-Tree变种) 非叶子节点不存储data,只存储索引 ...
 - 【模板】最小割树(Gomory-Hu Tree)
		
传送门 Description 给定一个\(n\)个点\(m\)条边的无向连通图,多次询问两点之间的最小割 两点间的最小割是这样定义的:原图的每条边有一个割断它的代价,你需要用最小的代价使得这两个点不 ...
 - SSAS系列——【07】多维数据(查询Cube)
		
原文:SSAS系列——[07]多维数据(查询Cube) 1.什么是MDX? MDX叫做"多维表达式",是一种查询语言,是一种和SQL类似的查询语言,它基于 XML for Anal ...
 - SSAS系列——【06】多维数据(创建Cube)
		
原文:SSAS系列--[06]多维数据(创建Cube) 1.文件类型说明 项目定义文件 (.dwproj).项目用户设置 (.dwproj.user).数据源文件 (.ds).数据源视图文件 (.ds ...
 - SSAS系列——【04】多维数据(物理体系结构)
		
原文:SSAS系列——[04]多维数据(物理体系结构) 1.本地多维数据集 本地多维数据集和本地挖掘模型允许在客户端工作站与网络的连接断开时对该工作站进行分析.在与本地多维数据集进行交互时,ADMOD ...
 - SSAS系列——【05】多维数据(编程体系结构)
		
原文:SSAS系列--[05]多维数据(编程体系结构) 1.什么是AMO? 翻译:AMO是SSAS中一个完整的管理类集合,它在Microsoft.AnalysisServices命名空间下,我们可以在 ...
 
随机推荐
- springboot  jpa操作redis
			
SpringBoot使用Redis缓存 (1)pom.xml引入jar包,如下: <dependency> <groupId>org.springframework.boo ...
 - NB-IOT移植移动onenet基础通信套件之Object_ID,实例ID,资源ID
			
1. 访问是按照分层的,Object_ID/实例ID/资源ID,对应每一层ID的数据类型,目前是分为3层,一个实例下面可以有多个实例id,对下面的数据结构来说,如果是资源ID的话,类型只能是asBuf ...
 - webpack loader 生成虚拟文件的方案
			
此文已由作者张磊授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 使用 webpack 的时候,难免需要写一些 loader,接着就会遇到一个很纠结的问题.该 loade ...
 - 1.1.0 Unity零基础入门2——Roll a Ball
			
1. 游戏界面 2.代码 //FoodRotate - - 控制cube旋转 using System.Collections; using System.Collections.Generic; u ...
 - 前端开发工程师 - 02.JavaScript程序设计 - 第1章.基础篇
			
第1章--基础篇 JS介绍 html 网页的内容:css 网页的样式:javascript 网页的行为 i.e. hello world <!DOCTYPE html> <html& ...
 - Zookeeper与Eureka的区别
			
Zookeeper与Eureka的区别 想要了解Zk与eureka的区别首先要知道CAP定理 CAP定理 Mysql强一致性(数据唯一出处),设计数据库设计的三范式 (表必须有主键:表不能有重复的列: ...
 - 中文乱码的处理—@北河的ppt
 - java 流 文件 IO
			
Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类 ...
 - vivado使用感想
			
寒假学了一学期vivado也没有学出什么名堂:为了调试龙芯的五级流水CPU,今天肝了一下午结果还把vivado给摸清楚了,果然是以目标为导向最能出成绩. vivado开发硬件的流程 写代码 模拟仿真s ...
 - 统计单词数:string函数使用
			
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...