KD-tree

**了这道题

这个估价函数好鬼畜,把min打成max。。。

关于min的估价函数非常鬼畜,具体我也不知道为什么。

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + ;
int n, d, root, ans = 2e9, mx, mn;
struct data {
int x, y, mxx, mnx, mny, mxy, lc, rc;
bool friend operator < (const data &a, const data &b) {
if(d == ) return a.x == b.x ? a.y < b.y : a.x < b.x;
if(d == ) return a.y == b.y ? a.x < b.x : a.y < b.y;
}
} a[N];
void update(int x)
{
a[x].mnx = min(a[x].x, min(a[a[x].lc].mnx, a[a[x].rc].mnx));
a[x].mxx = max(a[x].x, max(a[a[x].lc].mxx, a[a[x].rc].mxx));
a[x].mny = min(a[x].y, min(a[a[x].lc].mny, a[a[x].rc].mny));
a[x].mxy = max(a[x].y, max(a[a[x].lc].mxy, a[a[x].rc].mxy));
}
int build(int l, int r, int D)
{
if(l > r) return ;
int mid = (l + r) >> ;
nth_element(a + l, a + mid, a + r + );
a[mid].mnx = a[mid].mxx = a[mid].x;
a[mid].mny = a[mid].mxy = a[mid].y;
a[mid].lc = build(l, mid - , D ^ );
a[mid].rc = build(mid + , r, D ^ );
update(mid);
return mid;
}
int query_mn(int k, int x, int y)
{
int d = abs(a[k].x - x) + abs(a[k].y - y),
dl = a[k].lc ? max(a[a[k].lc].mnx - x, ) + max(x - a[a[k].lc].mxx, ) + max(a[a[k].lc].mny - y, ) + max(y - a[a[k].lc].mxy, ) : 5e8,
dr = a[k].rc ? max(a[a[k].rc].mnx - x, ) + max(x - a[a[k].rc].mxx, ) + max(a[a[k].rc].mny - y, ) + max(y - a[a[k].rc].mxy, ) : 5e8;
if(d) mn = min(mn, d);
if(dl < dr)
{
if(mn > dl) query_mn(a[k].lc, x, y);
if(mn > dr) query_mn(a[k].rc, x, y);
}
else
{
if(mn > dr) query_mn(a[k].rc, x, y);
if(mn > dl) query_mn(a[k].lc, x, y);
}
}
int query_mx(int k, int x, int y)
{
int d = abs(a[k].x - x) + abs(a[k].y - y),
dl = a[k].lc ? max(abs(a[a[k].lc].mnx - x), abs(a[a[k].lc].mxx - x)) + max(abs(a[a[k].lc].mny - y), abs(a[a[k].lc].mxy - y)) : -5e8,
dr = a[k].rc ? max(abs(a[a[k].rc].mnx - x), abs(a[a[k].rc].mxx - x)) + max(abs(a[a[k].rc].mny - y), abs(a[a[k].rc].mxy - y)) : -5e8;
if(d) mx = max(mx, d);
if(dl > dr)
{
if(mx < dl) query_mx(a[k].lc, x, y);
if(mx < dr) query_mx(a[k].rc, x, y);
}
else
{
if(mx < dr) query_mx(a[k].rc, x, y);
if(mx < dl) query_mx(a[k].lc, x, y);
}
}
int main()
{
a[].mnx = a[].mny = 5e8;
a[].mxx = a[].mxy = -5e8;
scanf("%d", &n);
for(int i = ; i <= n; ++i) scanf("%d%d", &a[i].x, &a[i].y);
root = build(, n, );
for(int i = ; i <= n; ++i)
{
mx = -5e8;
mn = 5e8;
query_mn(root, a[i].x, a[i].y);
query_mx(root, a[i].x, a[i].y);
ans = min(ans, mx - mn);
}
printf("%d\n", ans);
return ;
}

bzoj1941的更多相关文章

  1. 【bzoj1941】 Sdoi2010—Hide and Seek

    http://www.lydsy.com/JudgeOnline/problem.php?id=1941 (题目链接) 题意 给出n个二维平面上的点,求一点使到最远点的距离-最近点的距离最小. Sol ...

  2. 【kd-tree】bzoj1941 [Sdoi2010]Hide and Seek

    枚举每个点,计算离他最近的和最远的点. #include<cstdio> #include<cmath> #include<algorithm> using nam ...

  3. [BZOJ1941][Sdoi2010]Hide and Seek

    [BZOJ1941][Sdoi2010]Hide and Seek 试题描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他 ...

  4. bzoj1941 hdu5992

    看了青岛赛区的题简单学了一下kd,感觉这东西还是挺厉害的 一般kd树找最近点对最坏是O(n),但是随机情况下跑得还是很快的 kd树是一棵BST,但是每一层的关键字不同 一般写法是按照每一维轮流来,这一 ...

  5. 【BZOJ1941】Hide and Seek(KD-Tree)

    [BZOJ1941]Hide and Seek(KD-Tree) 题面 BZOJ 洛谷 题解 \(KD-Tree\)对于每个点搜一下最近点和最远点就好了 #include<iostream> ...

  6. 【BZOJ1941】[Sdoi2010]Hide and Seek KDtree

    [BZOJ1941][Sdoi2010]Hide and Seek Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了 ...

  7. KD-Tree复习笔记(BZOJ1941 & BZOJ2648 & BZOJ4066)

    快一年了都没碰到什么必须用KDT的题目导致模板完全忘光了,重新复习了一下. K_Dimention_Tree是一种用来处理二维以上问题的数据结构(OI中一般都是二维),本质是二维启发式估价函数实现剪枝 ...

  8. [bzoj1941][Sdoi2010]Hide and Seek_KD-Tree

    Hide and Seek bzoj-1941 Sdoi-2010 题目大意:给出平面上n个点,选出一个点,使得距离这个点的最远点曼哈顿距离减去距离这个点的最近非己点的曼哈顿距离最小.输出最小曼哈顿距 ...

  9. 【BZOJ-1941】Hide and Seek KD-Tree

    1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec  Memory Limit: 162 MBSubmit: 830  Solved: 455[Submi ...

  10. 【bzoj1941】【Sdoi2010】Hide and Seek

    ---恢复内容开始--- Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡 ...

随机推荐

  1. ggplot2-为图形加入直线

    本文更新地址:http://blog.csdn.net/tanzuozhev/article/details/51112057 本文在 http://www.cookbook-r.com/Graphs ...

  2. 从主机给VM Copy文件

    不能从主机给VM 复制文件,在VM里,setting --->option--->shareFolder-->enable-->add(要share的文件路径) then=== ...

  3. C# trim split dataGrid

    C#中Trim().TrimStart().TrimEnd()的用法:     这三个方法用于删除字符串头尾出现的某些字符.Trim()删除字符串头部及尾部出现的空格,删除的过程为从外到内,直到碰到一 ...

  4. idea刷新项目、清除项目缓存

    点击File -> Invalidate caches ,点击之后在弹出框中点击确认,之后软件就自动重启了

  5. Caffe学习系列(12):训练和测试自己的图片--linux平台

    Caffe学习系列(12):训练和测试自己的图片   学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测 ...

  6. Dos下mySql

    2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ...

  7. java 对账关键点

    原理:双方交易信息对比是否平账 注意:对账bean必须重写 equals 方法 如图: //对账方法

  8. nginx 安装和配置文件说明

    1. 安装依赖包 yum install gcc gcc+ yum install -y pcre pcre-devel openssl openssl-devel zlib zlib-devel 2 ...

  9. 优化梯度计算的改进的HS光流算法

    前言 在经典HS光流算法中,图像中两点间的灰度变化被假定为线性的,但实际上灰度变化是非线性的.本文详细分析了灰度估计不准确造成的偏差并提出了一种改进HS光流算法,这种算法可以得到较好的计算结果,并能明 ...

  10. 模式识别之分类器knn---c语言实现带训练数据---反余弦匹配

    邻近算法   KNN算法的决策过程 k-Nearest Neighbor algorithm是K最邻近结点算法(k-Nearest Neighbor algorithm)的缩写形式,是电子信息分类器算 ...