模板—K-D-tree(P2479 [SDOI2010]捉迷藏)
#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]捉迷藏)的更多相关文章
- P2479 [SDOI2010]捉迷藏
传送门 KDtree是个吼东西啊-- 枚举每一个点,然后求出离他距离最远和最近的点的距离,更新答案 然而为什么感觉KDtree只是因为剪枝才能跑得动呢-- //minamoto #include< ...
- [SDOI2010]捉迷藏 K-Dtree
[SDOI2010]捉迷藏 链接 luogu 思路 k-dtree模板题 代码 #include <bits/stdc++.h> #define ls (t[u].ch[0]) #defi ...
- k短路模板(洛谷P2483 [SDOI2010]魔法猪学院)(k短路,最短路,左偏树,priority_queue)
你谷数据够强了,以前的A*应该差不多死掉了. 所以,小伙伴们快来一起把YL顶上去把!戳这里! 俞鼎力的课件 需要掌握的内容: Dijkstra构建最短路径树. 可持久化堆(使用左偏树,因其有二叉树结构 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 洛谷P3690 [模板] Link Cut Tree [LCT]
题目传送门 Link Cut Tree 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代 ...
- 洛谷 [P2483] [模板] k短路
人生中的第一道黑题... 其实就是k短路模板 #include <iostream> #include <cstdio> #include <cstring> #i ...
- 【题解】[SDOI2010]捉迷藏
题目链接:https://www.luogu.com.cn/problem/P2479 题目大意:求平面\(n\)个点中,到其它\(n-1\)个点的曼哈顿距离最大和最小距离之差最小的点,求出这个这个距 ...
- [模板] k短路
简介 Dijkstra最短路+A*搜索. 先逆向求所有点到终点的最短路 \(dis[i]\). 定义估价函数 \(f[i] = d[i] + dis[i]\) , 其中 \(d[i]\) 表示当前起点 ...
- [SDOI2010]捉迷藏
嘟嘟嘟 k-d tree板儿题. 建完树后对每一个点求一遍最小和最大曼哈顿距离,是曼哈顿,不是欧几里得. #include<cstdio> #include<iostream> ...
随机推荐
- 2019.9.18 csp-s模拟测试46 反思总结
神志不清: 回去休息(x)继续考试(√) 非常爆炸的一次考试.看错题码完T1回去再看发现自己过于幼稚,T2读完题看着16mb的空间秒出正解然后逻辑出现致命失误100pts->0pts,T3看了一 ...
- redis书籍
redis中文官网命令网址:http://doc.redisfans.com/ redis英文官网命令网址:https://redis.io/commands redis书籍 由 Karl Segui ...
- Django基础内容整理
- web前端学习(二)html学习笔记部分(8)--服务器推送事件3
1.2.22 html5服务器推送事件 1.2.22.1 html5服务器推送事件介绍 服务器推送事件(Server-sent Events)是HTML5规范中的一个组成部分,可以用来从服务器端实 ...
- HDU 1536 求解SG函数
#include<stdio.h> #include<string.h> #include<algorithm> #include<set> using ...
- Django 点滴
1.views 中可用 render 传递参数 def home(request): info_dict = {'site': u'震撼学习', 'content': u'各种IT技术'} #Tuto ...
- python实现六大分群质量评估指标(兰德系数、互信息、轮廓系数)
python实现六大分群质量评估指标(兰德系数.互信息.轮廓系数) 1 R语言中的分群质量--轮廓系数 因为先前惯用R语言,那么来看看R语言中的分群质量评估,节选自笔记︱多种常见聚类模型以及分群质量评 ...
- vue自定义全局公共函数
单独零散的函数 在main.js里进行全局注册 Vue.prototype.ajax = function (){} 在所有组件里可调用 this.ajax() 多个函数定义在一个对象里 // xx. ...
- SDUT-3378_数据结构实验之查找六:顺序查找
数据结构实验之查找六:顺序查找 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在一个给定的无序序列里,查找与给定关键字 ...
- 移动端fixed定位在底部,出现键盘后消失
jq var h=$(window).height(); $(window).resize(function() { if($(window).height()<h){ $('.nav').hi ...