【BZOJ1941】Hide and Seek(KD-Tree)

题面

BZOJ

洛谷

题解

\(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)的更多相关文章

  1. 【BZOJ2002】弹飞绵羊(Link-Cut Tree)

    [BZOJ2002]弹飞绵羊(Link-Cut Tree) 题面 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lost ...

  2. 【CF1172E】Nauuo and ODT(Link-Cut Tree)

    [CF1172E]Nauuo and ODT(Link-Cut Tree) 题面 CF 给你一棵树,每个节点有一个颜色. 定义一条路径的权值为路径上不同颜色的数量.求所有有向路径的权值和. 有\(m\ ...

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

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

  4. 【MySQL】索引的本质(B+Tree)解析

    索引是帮助MySQL高效获取数据的排好序的数据结构. 索引数据结构 二叉树 红黑树 Hash表 B-Tree MySQL所使用为B+Tree (B-Tree变种) 非叶子节点不存储data,只存储索引 ...

  5. 【模板】最小割树(Gomory-Hu Tree)

    传送门 Description 给定一个\(n\)个点\(m\)条边的无向连通图,多次询问两点之间的最小割 两点间的最小割是这样定义的:原图的每条边有一个割断它的代价,你需要用最小的代价使得这两个点不 ...

  6. SSAS系列——【07】多维数据(查询Cube)

    原文:SSAS系列——[07]多维数据(查询Cube) 1.什么是MDX? MDX叫做"多维表达式",是一种查询语言,是一种和SQL类似的查询语言,它基于 XML for Anal ...

  7. SSAS系列——【06】多维数据(创建Cube)

    原文:SSAS系列--[06]多维数据(创建Cube) 1.文件类型说明 项目定义文件 (.dwproj).项目用户设置 (.dwproj.user).数据源文件 (.ds).数据源视图文件 (.ds ...

  8. SSAS系列——【04】多维数据(物理体系结构)

    原文:SSAS系列——[04]多维数据(物理体系结构) 1.本地多维数据集 本地多维数据集和本地挖掘模型允许在客户端工作站与网络的连接断开时对该工作站进行分析.在与本地多维数据集进行交互时,ADMOD ...

  9. SSAS系列——【05】多维数据(编程体系结构)

    原文:SSAS系列--[05]多维数据(编程体系结构) 1.什么是AMO? 翻译:AMO是SSAS中一个完整的管理类集合,它在Microsoft.AnalysisServices命名空间下,我们可以在 ...

随机推荐

  1. 「日常训练」Equation(HDU-5937)

    题意与分析 时隔一个月之后来补题.说写掉的肯定会写掉. 题意是这样的:给1~9这些数字,每个数字有\(X_i\)个,问总共能凑成多少个不同的等式\(A+B=C\)(\(A,B,C\)均为1位,\(1+ ...

  2. 「日常训练」Case of Matryoshkas(Codeforces Round #310 Div. 2 C)

    题意与分析(CodeForces 556C) 为了将所有\(n\)个娃娃编号递增地串在一起(原先是若干个串,每个串是递增的), 我们有两种操作: 拆出当前串中最大编号的娃娃(且一定是最右边的娃娃). ...

  3. 第六章 高级I/O函数

    第六章 高级I/O函数 6.1 pipe函数 即管道函数,用于进程间的通信. #include<unistd.h> int pipe(int fd[2]); // fd:filedes / ...

  4. 【progress】 进度条组件说明

    progress 进度条组件 原型: <progress percent="[Float(0-100)]" show-info="[Boolean]" b ...

  5. Machine Learning笔记整理 ------ (三)基本性能度量

    1. 均方误差,错误率,精度 给定样例集 (Example set): D = {(x1, y1), (x2, y2), (x3, y3), ......, (xm, ym)} 其中xi是对应属性的值 ...

  6. linux 文件已经删除,但是空间没有释放的原因

    监控系统报告一台服务器的空间满了,登陆后发现/tmp下有大量access_log文件,分析是Apache的日志文件很久没有清理了,确认并执行删除操作. 但是,问题来了,执行 rm /tmp/acces ...

  7. 《剑指Offer》题十一~题二十

    十一.旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组{3, 4, 5, 1, 2}为{ ...

  8. 算法与数据结构实验题 6.3 search

    ★实验任务 可怜的 Bibi 刚刚回到家,就发现自己的手机丢了,现在他决定回头去搜索 自己的手机. 现在我们假设 Bibi 的家位于一棵二叉树的根部.在 Bibi 的心中,每个节点 都有一个权值 x, ...

  9. CSS基础小记

    2017/10/29 CSS 认识CSS样式 CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏览器内的显示样式,如文字 ...

  10. Java常用类之String

    String 类: 1. java.lang.String 类代表不可变的字符序列:  2. “XXX” 为该类的一个对象: 3. String 类的常用构造方法: ① String(String o ...