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. 几种常用的listenner

    1.ServletContextListener:监控web容器的启动和关闭 2.HttpSessionListener:监控bs结构中b的session创建和session销毁 3.HttpSess ...

  2. Odoo 养猪

    阶段 仔猪养成为肉猪 乳猪养成为仔猪 母猪繁殖乳猪     每一个饲养阶段,基本上在同一组笼舍,活动场所:进入到下一饲养阶段才会转换笼舍.在每一个饲养阶段,基本上经历以下过程 饲养 注射疫苗 饲养 投 ...

  3. website link

    error: template with C linkage http://blog.csdn.net/jiong_1988/article/details/7915420http://velep.c ...

  4. Integrate NSX into Neutron

    NSX is VMware's strategy for Software-defined networking, it was implemented purely in software, and ...

  5. px rem css 转换工具

    http://520ued.com/tools/rem mark 一下 貌似还挺好用

  6. Matlab中图片保存的四种方法

    matlab的绘图和可视化能力是不用多说的,可以说在业内是家喻户晓的.Matlab提供了丰富的绘图函数,比如ez**系类的简易绘图函数,surf.mesh系类的数值绘图函数等几十个.另外其他专业工具箱 ...

  7. Core Data 版本号迁移经验总结

    大家在学习和使用Core Data过程中,第一次进行版本号迁移的经历一定是记忆犹新,至少我是这种,XD.弄的不好,就会搞出一些因为迁移过程中数据模型出错导致的Crash.这里总结了一下Core Dat ...

  8. ORACLE 36进制和10进制,互相转换函数

    第一部分 --36转10进制 create or replace function f_36to10 (str varchar) return int  is returnValue int;   s ...

  9. linux下安装jdk(转载)

    http://blog.csdn.net/hzqnju/article/details/6779556 http://blog.csdn.net/gxy3509394/article/details/ ...

  10. unity3d开发的android应用中增加AD系统的详细步骤

    unity3d开发的android应用中增加AD系统的详细步骤 博客分类: Unity3d unity3d  Unity3d已经支持android,怎样在程序里增加admob?  试了一下,确实能够, ...