模板—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> ...
随机推荐
- Javascript模块化编程(一)模块的写法最佳实践
Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类clas ...
- VUE打包好的文件部署让beego实现静态文件访问,如何用根目录来访问静态文件?
最近的一个全栈项目,光伏云监控系统,后端使用beego框架,纯api,前端使用VUE2.0.项目地址:http://scada.ssechina.com:88/static 我把打包好的前端文件放到g ...
- MySQL错误1055
问题描述:在MySQL数据库下,执行SQL插入语句报错.错误信息如下: 错误原因:在MySQL5.7之后,sql_mode中默认存在ONLY_FULL_GROUP_BY,SQL语句未通过ONLY_FU ...
- python 处理缺失值
- 【洛谷P3131】 【USACO16JAN】子共七
P3131 [USACO16JAN]子共七Subsequences Summing to Sevens 题目描述 Farmer John's cows are standing in a row, a ...
- 开始使用Apache弗林克和Mapr Streams
Introduction MapR Ecosystem Package 2.0 (MEP) is coming with some new features related to MapR Strea ...
- notepad++ 退出后关闭所有文档(关闭“记住最后打开的文件”)
旧版本: 设置->首选项->其他->取消勾选Remember current session for next launch 新版本: 设置->首选项->备份->取 ...
- 杨柳絮-Info:春天将不再漫天飞“雪”,济源治理杨柳絮在行动
ylbtech-杨柳絮-Info:春天将不再漫天飞“雪”,济源治理杨柳絮在行动 1.返回顶部 1. 天气暖和了,连心情都是阳光的.然而,在这美好的时刻,漫天飞舞的杨柳絮,甚是煞风景.<ignor ...
- POJ3889Fractal Streets
Fractal Streets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 445 Accepted: 162 Des ...
- Webpack ERROR in Path must be a string. Received undefined
在学习webpack过程中,我遇到的下面这个问题及解决方法. 问题如下: node版本如下截图: package.json文件截图: webpack.config.js文件截图: 然后,我运行项目,报 ...