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. vue2.0 flexible.js + rem 进行自适应开发

    1.在页面中引入flexible.js base.js /** * flexible.js 阿里前端自适应解决方案 */ ;(function(win, lib) { var doc = win.do ...

  2. php错误封装类

    1.创建MyErrorHandler.php文件 代码如下: <?php class MyErrorHandler { public $message; public $filename; pu ...

  3. 【随想】android是个什么东西,andorid机制随想

    优秀程序猿的天性就是好奇,软件是怎么运作的.屏幕是怎样显示的.桌面窗口为何能如此人性化的被鼠标拖动? 假设你常常会有这样一些问题迸发在脑海中,恭喜你,你是一名非常有潜力的程序猿. 我在大学读的是自己主 ...

  4. Android获取手机方向

    假设用户开启了设置里的屏幕旋转,Android中处理横竖屏切换,通常的做法是在AndroidManifest.xml中定义android:configChanges="orientation ...

  5. C++代码书写模板 -- 如何判断函数类型

    先说一个简单的方案. 经过验证 g++ 和 vs2010 都可以.原理就是利用函数类型可以直接转换成函数指针. template<class T> bool test( T * t ) { ...

  6. WPF学习专题

    http://developer.51cto.com/art/200809/88207.htm

  7. mvn 添加本地jar包

  8. UIView封装动画--iOS利用系统提供方法来做转场动画

    UIView封装动画--iOS利用系统提供方法来做转场动画 UIViewAnimationOptions option; if (isNext) { option=UIViewAnimationOpt ...

  9. java之EJB

    EjB,只是一个服务端运行组件,公开接口供客户端以C/S方式调用而已. 最直白,最本质的解释,可参见: http://blog.csdn.net/jojo52013145/article/detail ...

  10. 高精度乘法(FFT)

    学会了FFT之后感觉自己征服了世界! 当然是幻觉... 不过FFT还是很有用的,在优化大规模的动规问题的时候有极大效果. 一般比较凶残的计数动规题都需要FFT(n<=1e9). 下面是高精度乘法 ...