[SDOI2010]捉迷藏

链接

luogu

思路

k-dtree模板题

代码

#include <bits/stdc++.h>
#define ls (t[u].ch[0])
#define rs (t[u].ch[1])
#define cmin(a,b) (a>b?a=b:a)
#define cmax(a,b) (a>b?a:a=b)
using namespace std;
const int N=5e5+7;
const int INF=0x3f3f3f3f;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,rt,WD;
struct point {
int x[2];
bool operator < (const point &b) const {
return x[WD]<b.x[WD];
}
}p[N];
struct node{
int mi[2],ma[2],ch[2];
point a;
}t[N];
void update(int x,int y) {
cmin(t[x].mi[0],t[y].mi[0]);
cmin(t[x].mi[1],t[y].mi[1]);
cmax(t[x].ma[0],t[y].ma[0]);
cmax(t[x].ma[1],t[y].ma[1]);
}
void up(int u) {
t[u].mi[0]=t[u].ma[0]=t[u].a.x[0];
t[u].mi[1]=t[u].ma[1]=t[u].a.x[1];
if(ls) update(u,ls);
if(rs) update(u,rs);
}
int build(int l,int r,int wd) {
if(l>r) return 0;
int mid=(l+r)>>1;
WD=wd;
nth_element(p+l,p+mid,p+r+1);
int u=mid;
t[u].a=p[mid];
ls=build(l,mid-1,wd^1);
rs=build(mid+1,r,wd^1);
up(u);
return u;
}
int dis(point a,point b) {
return abs(a.x[0]-b.x[0])+abs(a.x[1]-b.x[1]);
}
int get_min(int u,point a) {
int rec=0;
for(int i=0;i<2;++i)
rec+=max(t[u].mi[i]-a.x[i],0)+max(a.x[i]-t[u].ma[i],0);
return rec;
}
int get_max(int u,point a) {
int rec=0;
for(int i=0;i<2;++i)
rec+=max(abs(a.x[i]-t[u].ma[i]),abs(a.x[i]-t[u].mi[i]));
return rec;
}
int ans1,ans2;
void query_min(point a,int u) {
if(dis(a,t[u].a)) ans1=min(ans1,dis(a,t[u].a));
int dl=INF,dr=INF;
if(ls) dl=get_min(ls,a);
if(rs) dr=get_min(rs,a);
if(dl<dr) {
if(ans1>dl) query_min(a,ls);
if(ans1>dr) query_min(a,rs);
} else {
if(ans1>dr) query_min(a,rs);
if(ans1>dl) query_min(a,ls);
}
}
void query_max(point a,int u) {
ans2=max(ans2,dis(a,t[u].a));
int dl=-INF,dr=-INF;
if(ls) dl=get_max(ls,a);
if(rs) dr=get_max(rs,a);
if(dl<dr) {
if(ans2<dr) query_max(a,rs);
if(ans2<dl) query_max(a,ls);
} else {
if(ans2<dl) query_max(a,ls);
if(ans2<dr) query_max(a,rs);
}
}
int main() {
n=read();
for(int i=1;i<=n;++i) p[i].x[0]=read(),p[i].x[1]=read();
rt=build(1,n,0);
int ans=INF;
for(int i=1;i<=n;++i) {
ans1=INF,ans2=0;
query_min(p[i],rt);
query_max(p[i],rt);
// printf("(%d,%d) min=%d max=%d\n",p[i].x[0],p[i].x[1],ans1,ans2);
ans=min(ans,ans2-ans1);
}
printf("%d",ans);
return 0;
}

[SDOI2010]捉迷藏 K-Dtree的更多相关文章

  1. P2479 [SDOI2010]捉迷藏

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

  2. 模板—K-D-tree(P2479 [SDOI2010]捉迷藏)

    #include<algorithm> #include<iostream> #include<cstdio> #include<cmath> #def ...

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

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

  4. [SDOI2010]捉迷藏

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

  5. luoguP2479 [SDOI2010]捉迷藏

    https://www.luogu.org/problemnew/show/P2479 据说可以用线段树做但是我不会,只能写一个 KD-Tree 了 对于每个点求出距离它最远的点和最近的点的距离,然后 ...

  6. [学习笔记]K-D Tree

    以前其实学过的但是不会拍扁重构--所以这几天学了一下 \(K-D\ Tree\) 的正确打开姿势. \(K\) 维 \(K-D\ Tree\) 的单次操作最坏时间复杂度为 \(O(k\times n^ ...

  7. 2021.07.09 K-D树

    2021.07.09 K-D树 前置知识 1.二叉搜索树 2.总是很长的替罪羊树 K-D树 建树 K-D树具有二叉搜索树的形态,对于每一个分类标准,小于标准的节点在父节点左边,大于标准的节点在父节点右 ...

  8. KD-Tree总结

    KD-Tree总结 问题引入 平面上有\(n\)个点,\(q\)组询问,每一次查询距离\((x,y)\)最近的点对,强制在线. 问题解决 暴力 显然我们可以直接枚举点然后算距离取\(min\),这样子 ...

  9. django模型操作

    Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表        

随机推荐

  1. (9)ASP.NET Core 中的MVC路由二

    1.URL生成 MVC应用程序可以使用路由的URL生成功能,生成指向操作(Action)的URL链接. IUrlHelper 接口用于生成URL,是MVC与路由之间的基础部分.在控制器.视图和视图组件 ...

  2. Tomcat 类加载器的实现

    Tomcat 内部定义了多个 ClassLoader,以便应用和容器访问不同存储库中的类和资源,同时达到应用间类隔离的目的.本文首发于公众号:顿悟源码. 1. Java 类加载机制 类加载就是把编译生 ...

  3. asp.net core mvc 集成miniprofiler

    原文:asp.net core mvc 集成miniprofiler asp.net core mvc 集成miniprofiler 一.环境介绍 二.监控asp.net 页面 三.监控执行的sql语 ...

  4. FileUpload上传多张照片

    <asp:FileUpload ID="uploaderInput" runat="server" multiple="multiple&quo ...

  5. Windows 查看端口占用进程并关闭

    当我们在运行一些软件需要特定软件(如tomcat)时,有可能会碰上端口被占用的情况,这时候我们可能就需要更改端口或把占用端口的进程结束掉,因为更换端口可能会导致当前环境产生一些的问题或是需要重新配置其 ...

  6. @Valid注解的使用springmvc pojo校验

    @Valid注解用于校验,所属包为:javax.validation.Valid. ① 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于User类中的属性): ...

  7. 颜色rgba和16进制

    今天阅读代码的时候看到了一个实现颜色渐变的效果,不同于以往使用函数实现的颜色渐变,这个是规律的递增rgba里面的几个参数完成的,看起来就像是等差数列一样.没想到还能这样来,简单的了解了一下 rgba的 ...

  8. 去世父亲在儿子手机中复活,这可能是最温暖的一个AI

    美国青年James Vlahos的父亲不幸因病去世,但聊以慰藉的是,现在他每天还能和父亲聊天并收到回复,而且父亲在回复中的口吻与语气,就仿佛还「活着」一样. 这并不是恐怖片剧情,而是科技的魔幻力量:回 ...

  9. 2019-07-29 ThinkPHP简单的增删改查

    在model里面,建立表名Model.class.php的控制器,用以连接数据表,代码如下 namespace Home\Model; use Think\Model; class NewsModel ...

  10. Mac 设置redis开机启动

    1.创建一个plist文件 首先我们需要在/Library/LaunchDaemons目录下创建一个plist文件,使用如下命令: 复制代码代码如下: sudo vim /Library/Launch ...