#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学习(一):软链接和硬链接

    今天起,决定开始自学Linux命令及Shell脚本,并用Linux学习(命令行,Shell及其他知识点)这一系列记录下自己的心路历程,内容不分先后,只记录自己觉得有必要的,简单的就不记了! 第一个知识 ...

  2. Linux 基础命令3 shell

    echo 显示一行文本 各种展开的实例 波浪线展开 算术表达式展开 支持的运算 奇怪的花括号展开 花括号的..用法 花括号(任选一个)的嵌套 参数展开$符很重要哦(一种展开做另一种的参数) 命令的替换 ...

  3. oracle习题集-高级查询

    1.问题:查询每个员工的部门名称,列出员工姓名和部门名称 select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno 2. 问题: ...

  4. Uva1252 Twenty Questions

    Twenty Questions https://odzkskevi.qnssl.com/15b7eb4cd1f75f63cee3945b0b845e4f?v=1508411736 [题解] dp[S ...

  5. BZOJ2529: [Poi2011]Sticks

    2529: [Poi2011]Sticks Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 257  Solved: ...

  6. SQL Sever实验三 视图与数据更新

    一. 实验目的 1.掌握创建视图的 SQL 语句,数据更新的 SQL 语句. 2.了解使用创建视图向导创建视图的方法. 3.掌握使用 SQL 创建视图的方法,使用 SQL 更新数据的方法. 二. 实验 ...

  7. golang之switch

  8. CSS-DOM的小知识(一)

    在DOM编程艺术中,CSS-DOM应用很广泛. 1.style属性 通过element.style.property可以获得元素的样式,但是style属性只能够返回内嵌样式,对于外部样式表的样式和he ...

  9. ylbtech-自信:自信

    ylbtech-自信:自信 自信心(confidence),在心理学中,与其最接近的是班杜拉(A.Bandura)在社会学习理论中提出的自我效能感 (self-efficacy)的概念,是指个体对自身 ...

  10. httpserver支持路由传输控制器

    main.go package main import ( "net/http" "com.jtthink.net/myhttpserver/core" ) t ...