模板题 题意说的可能有点不清楚 一开始的点必须在给定的n个点里面

所以枚举点 然后ask最大和最小值

估价函数中 最大值的写法和最小值不同 全部取max

而最小值在估价时 如果在某个点管辖的空间里 就视为距离=0

估价函数如果写错 可能会导致wa or t

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<queue>
#include<string>
using namespace std;
#define L long long
const int INF = 999999999 ;
int n , root , cmp_d ;
struct node{
int d[2] , Max[2] , Min[2];
int l , r ;
}a[500050] ;
bool cmp(node a,node b){
return ((a.d[cmp_d] < b.d[cmp_d]) || (a.d[cmp_d] == b.d[cmp_d] && a.d[!cmp_d] < b.d[!cmp_d])) ;
}
void up(int p , int k ){
a[p].Max[0] = max(a[p].Max[0] , a[k].Max[0]);
a[p].Max[1] = max(a[p].Max[1] , a[k].Max[1]);
a[p].Min[0] = min(a[p].Min[0] , a[k].Min[0]);
a[p].Min[1] = min(a[p].Min[1] , a[k].Min[1]);
}
int build(int l, int r , int D ) {
int mid = (l+r) >> 1 ;
cmp_d = D;
nth_element(a+1+l,a+1+mid,a+1+r,cmp) ;
a[mid].Max[0] = a[mid].Min[0] = a[mid].d[0];
a[mid].Max[1] = a[mid].Min[1] = a[mid].d[1];
if(l != mid)
a[mid].l = build(l,mid-1,D^1);
else a[mid].l = 0 ;
if(r != mid)
a[mid].r = build(mid+1,r,D^1);
else a[mid].r = 0 ;
if(a[mid].l)up(mid,a[mid].l);
if(a[mid].r)up(mid,a[mid].r);
return mid ;
}
int ans1 , ans2 ;
int x, y ;
int getMaxdis(int p) {
int res = 0 ;
res += max(max(x - a[p].Max[0] , a[p].Max[0] - x) , max(x - a[p].Min[0] , a[p].Min[0] - x)) ;
res += max(max(y - a[p].Max[1] , a[p].Max[1] - y) , max(y - a[p].Min[1] , a[p].Min[1] - y)) ;
return res ;
}
void query_Max(int p) {
int d0 ;
int dl,dr ;
d0 = abs(x - a[p].d[0]) + abs(y - a[p].d[1]) ;
if(d0 != 0) {
ans2 = max(ans2 , d0) ;
}
if(a[p].l)
dl = getMaxdis(a[p].l) ;
else dl = -INF ;
if(a[p].r)
dr = getMaxdis(a[p].r) ;
else dr = -INF ;
if(dl > dr) {
if(dl > ans2)query_Max(a[p].l) ;
if(dr > ans2)query_Max(a[p].r) ;
}
else {
if(dr > ans2)query_Max(a[p].r) ;
if(dl > ans2)query_Max(a[p].l) ;
}
}
int getMindis(int p) {
int res = 0 ;
if(x > a[p].Max[0]) res += x - a[p].Max[0] ;
if(x < a[p].Min[0]) res += a[p].Min[0] - x ;
if(y > a[p].Max[1]) res += y - a[p].Max[1] ;
if(y < a[p].Min[1]) res += a[p].Min[1] - y ;
return res ;
}
void query_Min(int p) {
int d0 , dl , dr ;
d0 = abs(a[p].d[0] - x) + abs(a[p].d[1] - y) ;
if(d0 != 0) {
ans1 = min(d0 , ans1) ;
}
if(a[p].l)
dl = getMindis(a[p].l) ;
else dl = INF ;
if(a[p].r)
dr = getMindis(a[p].r) ;
else dr = INF ;
if(dl < dr) {
if(dl < ans1)query_Min(a[p].l) ;
if(dr < ans1)query_Min(a[p].r) ;
}
else {
if(dr < ans1)query_Min(a[p].r) ;
if(dl < ans1)query_Min(a[p].l) ;
}
}
int main(){
int n ;
scanf("%d",&n);
for(int i = 1; i <= n ; i ++ ){
scanf("%d%d",&a[i].d[0],&a[i].d[1]) ;
}
root = build(1,n,0) ;
int ans = INF ;
for(int i = 1; i <= n ; i ++ ){
ans1 = INF , ans2 = -INF ;
x = a[i].d[0] , y = a[i].d[1] ;
query_Max(root) ;
query_Min(root) ;
ans = min(ans , ans2 - ans1) ;
}
printf("%d\n",ans) ;
}

  

BZOJ 1941 kd-tree的更多相关文章

  1. BZOJ 1941: [Sdoi2010]Hide and Seek(k-d Tree)

    Time Limit: 16 Sec  Memory Limit: 162 MBSubmit: 1712  Solved: 932[Submit][Status][Discuss] Descripti ...

  2. BZOJ 3489: A simple rmq problem(K-D Tree)

    Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2579  Solved: 888[Submit][Status][Discuss] Descripti ...

  3. BZOJ 3053: The Closest M Points(K-D Tree)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1235  Solved: 418[Submit][Status][Discuss] Descripti ...

  4. BZOJ 4520: [Cqoi2016]K远点对(k-d tree)

    Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1162  Solved: 618[Submit][Status][Discuss] Descripti ...

  5. BZOJ 2648: SJY摆棋子(K-D Tree)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 6051  Solved: 2113[Submit][Status][Discuss] Descript ...

  6. K-D Tree题目泛做(CXJ第二轮)

    题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...

  7. k-d tree模板练习

    1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...

  8. luogu4169 [Violet]天使玩偶/SJY摆棋子 / bzoj2648 SJY摆棋子 k-d tree

    k-d tree + 重构的思想,就能卡过luogu和bzoj啦orz #include <algorithm> #include <iostream> #include &l ...

  9. AOJ DSL_2_C Range Search (kD Tree)

    Range Search (kD Tree) The range search problem consists of a set of attributed records S to determi ...

  10. k-d tree 学习笔记

    以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...

随机推荐

  1. Java 基础巩固:IO

    在学习IO的时候发现IO的类太多,如InputStream下面就用ReaderInputStream.InputStreamBuffer等等, 还用Reader.Writer.OutputStream ...

  2. 海康、大华NVR网络硬盘录像机录像无插件全平台访问实现—录像回放时间轴功能实现方法

    在之前的博文中我们有介绍方案*NVR硬件录像机web无插件播放方案(支持取特定时间段视频流)*:该片博文旨在介绍时间轴功能的实现和相关接口的调用: 时间轴样式展示: 问题分析 对于 时间轴的展示实现需 ...

  3. python字符串拼接相关

    #字符串拼接#str.join(元组.列表.字典.字符串) 之后生成的只能是字符串.str = "-";seq = ("a", "b", & ...

  4. Vue.js之组件嵌套小demo

    Vue.js之组件嵌套的小demo项目 第一步:初始化一个wabpack项目,这里不在复述.第二步:在components文件夹下新建Header.vue Footer.vue和Users.vue三个 ...

  5. window7系统下安装scrapy爬虫框架

    本文是在python3.6环境下安装的下面软件,如果大家和我的python版本不一致,请在页面选择符合自己版本的软件下载. 1.wheel pip install wheel 2.lxml 下载lxm ...

  6. SQL语句中的Having子句与where子句

    一.介绍 聚合函数如SUM, COUNT, MAX, AVG等.这些函数和其它函数的根本区别就是它们一般作用在多条记录上.而通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于 ...

  7. 虚拟化qemu-img的简单用法。

    qemu-img 命​令​行​工​具​是​ Xen 和​ KVM 用​来​格​式​化​各​种​文​件​系​统​的​,可​使​用​ qemu-img 格​式​化​虚​拟​客​户​端​映​像​.​附​加​ ...

  8. storage

    localStorage(本地存储),可以长期存储数据,没有时间限制,一天,一年,两年甚至更长,数据都可以使用. sessionStorage(会话存储),只有在浏览器被关闭之前使用,创建另一个页面时 ...

  9. Vimium~让您的Chrome起飞

    工欲善其事,必先利其器!撸起Vimium,我的Chrome就这么起飞了. 学起(了解几个快捷键即可)And撸起Vimium,想黑客一般在Chrome上飞起.Vimium常用快捷键(注:区分大小写)j, ...

  10. PAT 天梯赛 L1-009. N个数求和 【模拟】

    题目链接 https://www.patest.cn/contests/gplt/L1-009 思路 每一步每一步 往上加,但是要考虑 溢出,所以用 LONG LONG 而且 每一步 都要约分 才能保 ...