#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#define LL long long
#define MAXN 1000100
using namespace std;
inline LL min(LL a,LL b){return a<b?a:b;}
int n,cmpid;
struct point
{
int x[];
friend bool operator < (point a,point b)
{return a.x[cmpid]<b.x[cmpid];}
}p[MAXN];
struct tree
{
point p;
int mn[],mx[],l,r;
#define l(x) tr[x].l
#define r(x) tr[x].r
#define p(x) tr[x].p
}tr[MAXN];
int Dis(point a,point b)
{
return abs(a.x[]-b.x[])+abs(a.x[]-b.x[]);
}
int min_dis(tree a,point b)
{
int x=max(a.mn[]-b.x[],)+max(b.x[]-a.mx[],);
int y=max(a.mn[]-b.x[],)+max(b.x[]-a.mx[],);
return x+y;
}
int max_dis(tree a,point b)
{
int x=max(abs(a.mx[]-b.x[]),abs(b.x[]-a.mn[]));
int y=max(abs(a.mx[]-b.x[]),abs(b.x[]-a.mn[]));
return x+y;
}
struct KDtree
{
int root,tot,ans;
#define INF 0x7fffffff
void ask_max(point a,int x,int k)
{
if(!x)return;int tem;
if((tem=Dis(p(x),a))>ans)ans=tem;
int l=l(x),r=r(x);
if(a.x[k]<p(x).x[k])swap(l,r);
if(max_dis(tr[l],a)>ans)ask_max(a,l,k^);
if(max_dis(tr[r],a)>ans)ask_max(a,r,k^);
}
int ask_max(point a)
{
ans=-INF;
ask_max(a,root,);
return ans;
}
void ask_min(point a,int x,int k)
{
if(!x)return;int tem;
if((tem=Dis(p(x),a))<ans&&tem!=)ans=tem;
int l=l(x),r=r(x);
if(a.x[k]>p(x).x[k])swap(l,r);//如果a在x有右半区间,先向右搜索。
if(min_dis(tr[l],a)<ans)ask_min(a,l,k^);
if(min_dis(tr[r],a)<ans)ask_min(a,r,k^);
}
int ask_min(point a)
{
ans=INF;
ask_min(a,root,);
return ans;
}
void updata(int x)
{
if(!x)return;
if(l(x))
tr[x].mn[]=min(tr[x].mn[],tr[l(x)].mn[]),
tr[x].mn[]=min(tr[x].mn[],tr[l(x)].mn[]),
tr[x].mx[]=max(tr[x].mx[],tr[l(x)].mx[]),
tr[x].mx[]=max(tr[x].mx[],tr[l(x)].mx[]);
if(r(x))
tr[x].mn[]=min(tr[x].mn[],tr[r(x)].mn[]),
tr[x].mn[]=min(tr[x].mn[],tr[r(x)].mn[]),
tr[x].mx[]=max(tr[x].mx[],tr[r(x)].mx[]),
tr[x].mx[]=max(tr[x].mx[],tr[r(x)].mx[]);
}
void build(int &x,int l,int r,int k)
{
if(l>r)return;
x=++tot;int mid=(l+r)>>;
cmpid=k;
nth_element(p+l,p+mid,p+r+);
p(x)=p[mid];
tr[x].mn[]=tr[x].mx[]=p(x).x[];
tr[x].mn[]=tr[x].mx[]=p(x).x[];
build(l(x),l,mid-,k^);
build(r(x),mid+,r,k^);
updata(x);
}
void build()
{
tot=;
build(root,,n,);
}
}T;
signed main()
{
cin>>n;
for(int i=;i<=n;i++)
cin>>p[i].x[]>>p[i].x[];
T.build();
LL ans=INF;
for(int i=;i<=n;i++)
{
ans=min(ans,T.ask_max(p[i])-T.ask_min(p[i]));
}
cout<<ans<<endl;
}

放一下‘天使玩偶’的标程:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
int n,m,cmpid;
struct point
{
int x[];
friend bool operator < (point a,point b)
{return a.x[cmpid]<b.x[cmpid];}
}p[];
struct tree
{
point p;
int mx[],mn[],l,r;
#define l(x) tr[x].l
#define r(x) tr[x].r
#define p(x) tr[x].p
}tr[];
int dis(point a,point b){return abs(a.x[]-b.x[])+abs(a.x[]-b.x[]);}
int min_dis(tree a,point b)
{
int x=max(a.mn[]-b.x[],)+max(b.x[]-a.mx[],);
int y=max(a.mn[]-b.x[],)+max(b.x[]-a.mx[],);
return x+y;
}
struct KD_tree
{
int root,tot,ans;
#define INF 0x7fffffff
void ask_min(point a,int x,int k)
{
if(!x)return;int tem;
if((tem=dis(p(x),a))<ans)ans=tem;
int l=l(x),r=r(x);
if(a.x[k]>p(x).x[k])swap(l,r);
if(min_dis(tr[l],a)<ans)ask_min(a,l,k^);
if(min_dis(tr[r],a)<ans)ask_min(a,r,k^);
}
int ask_min(point a)
{
ans=INF;ask_min(a,root,);
return ans;
}
void updata(int x)
{
if(!x)return;
if(l(x))
tr[x].mn[]=min(tr[x].mn[],tr[l(x)].mn[]),
tr[x].mn[]=min(tr[x].mn[],tr[l(x)].mn[]),
tr[x].mx[]=max(tr[x].mx[],tr[l(x)].mx[]),
tr[x].mx[]=max(tr[x].mx[],tr[l(x)].mx[]);
if(r(x))
tr[x].mn[]=min(tr[x].mn[],tr[r(x)].mn[]),
tr[x].mn[]=min(tr[x].mn[],tr[r(x)].mn[]),
tr[x].mx[]=max(tr[x].mx[],tr[r(x)].mx[]),
tr[x].mx[]=max(tr[x].mx[],tr[r(x)].mx[]);
}
void build(int &x,int l,int r,int k)
{
if(l>r)return;
x=++tot;int mid=(l+r)>>;
cmpid=k;
nth_element(p+l,p+mid,p+r+);
p(x)=p[mid];
tr[x].mn[]=tr[x].mx[]=p(x).x[];
tr[x].mn[]=tr[x].mx[]=p(x).x[];
build(l(x),l,mid-,k^);
build(r(x),mid+,r,k^);
updata(x);
}
void build(){tot=;build(root,,n,);}
void insert(point a,int &x,int k)
{
if(!x)
{
x=++tot;p(x)=a;
tr[x].mn[]=tr[x].mx[]=p(x).x[];
tr[x].mn[]=tr[x].mx[]=p(x).x[];
return;
}
if(a.x[k]<p(x).x[k])insert(a,l(x),k^);
else insert(a,r(x),k^);
updata(x);
}
void insert(point a){insert(a,root,);}
}T;
signed main()
{
cin>>n>>m;
for(int i=;i<=n;i++)cin>>p[i].x[]>>p[i].x[];
T.build();int t,x,y;
for(int i=;i<=m;i++)
{
cin>>t>>x>>y;
if(t==)T.insert((point){x,y});
else cout<<T.ask_min((point){x,y})<<endl;;
}
}

模板—K-D-tree(P2479 [SDOI2010]捉迷藏)的更多相关文章

  1. P2479 [SDOI2010]捉迷藏

    传送门 KDtree是个吼东西啊-- 枚举每一个点,然后求出离他距离最远和最近的点的距离,更新答案 然而为什么感觉KDtree只是因为剪枝才能跑得动呢-- //minamoto #include< ...

  2. [SDOI2010]捉迷藏 K-Dtree

    [SDOI2010]捉迷藏 链接 luogu 思路 k-dtree模板题 代码 #include <bits/stdc++.h> #define ls (t[u].ch[0]) #defi ...

  3. k短路模板(洛谷P2483 [SDOI2010]魔法猪学院)(k短路,最短路,左偏树,priority_queue)

    你谷数据够强了,以前的A*应该差不多死掉了. 所以,小伙伴们快来一起把YL顶上去把!戳这里! 俞鼎力的课件 需要掌握的内容: Dijkstra构建最短路径树. 可持久化堆(使用左偏树,因其有二叉树结构 ...

  4. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  5. 洛谷P3690 [模板] Link Cut Tree [LCT]

    题目传送门 Link Cut Tree 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代 ...

  6. 洛谷 [P2483] [模板] k短路

    人生中的第一道黑题... 其实就是k短路模板 #include <iostream> #include <cstdio> #include <cstring> #i ...

  7. 【题解】[SDOI2010]捉迷藏

    题目链接:https://www.luogu.com.cn/problem/P2479 题目大意:求平面\(n\)个点中,到其它\(n-1\)个点的曼哈顿距离最大和最小距离之差最小的点,求出这个这个距 ...

  8. [模板] k短路

    简介 Dijkstra最短路+A*搜索. 先逆向求所有点到终点的最短路 \(dis[i]\). 定义估价函数 \(f[i] = d[i] + dis[i]\) , 其中 \(d[i]\) 表示当前起点 ...

  9. [SDOI2010]捉迷藏

    嘟嘟嘟 k-d tree板儿题. 建完树后对每一个点求一遍最小和最大曼哈顿距离,是曼哈顿,不是欧几里得. #include<cstdio> #include<iostream> ...

随机推荐

  1. 关于 linux 的 limit 的设置

    以下内容参考链接 1.file-max系统最大打开文件描述符数 永久性:在/etc/sysctl.conf中设置 2.nr_open是单个进程可分配的最大文件数. 内核支持的最大file handle ...

  2. opencv java swing 图片灰度化 二值化

    工程下载地址 https://download.csdn.net/download/qq_16596909/11503860 基于maven 首先引入opencv <!-- https://mv ...

  3. WIN7快捷键大全

    1. 轻松访问键盘快捷方式 按住右Sht 8秒钟: 启用和关闭筛选键 按左 Alt+左 Sht+PrtScn(或 PrtScn):启用或关闭高对比度 按左 Alt+左 Sht+Num Lock :启用 ...

  4. Java IO:如何得到Jar包中内嵌Jar包的时间戳

    ClassLoader bladeClassLoader = BladeCLI.class.getClassLoader(); URL url = bladeClassLoader.getResour ...

  5. webstorm/phpstorm破解版教程网址

    http://idea.lanyus.com/ http://www.php.cn/tool/phpstorm/408348.html 如果正版到期了,重新安装不能再次免费试用的话,之后我就用老版的w ...

  6. vue学习之组件(component)(一)

    组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下, ...

  7. Katalon系列十九:元素相同或无法定位时的定位技巧

    经常看到有人问元素属性都相同,怎么定位,这里总结一下.下面以Xpath为例讲解,CSS其实也是一样的,只是语法不一样罢了.网上说CSS会比Xpath快一些,但在Katalon主用Xpath,感觉也还行 ...

  8. git解决冲突的最佳方法

    用eclipse egit 去pull 代码出现冲突 点击details  全选复制到记事本上 如上图选择3个冲突中的一个   eclipse快捷键  ctrl + shift+R  张贴   回车 ...

  9. HTML小技巧:按钮中的文字换行 .

    一般按钮的文字都是一行的.但是有的时候画面需要按钮中的文字换行. 刚开始有个开发人员说没法实现.\r\n 都用过了没有效果.其实google这个老师是非常强大的. 直接换行的方法:<input ...

  10. POJ 2078

    16ms 解法: #include <cstdio> //using namespace std; ][]; ][]; ]; ]; int n,min,max; void solve(in ...