bzoj1941
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的更多相关文章
- 【bzoj1941】 Sdoi2010—Hide and Seek
http://www.lydsy.com/JudgeOnline/problem.php?id=1941 (题目链接) 题意 给出n个二维平面上的点,求一点使到最远点的距离-最近点的距离最小. Sol ...
- 【kd-tree】bzoj1941 [Sdoi2010]Hide and Seek
枚举每个点,计算离他最近的和最远的点. #include<cstdio> #include<cmath> #include<algorithm> using nam ...
- [BZOJ1941][Sdoi2010]Hide and Seek
[BZOJ1941][Sdoi2010]Hide and Seek 试题描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他 ...
- bzoj1941 hdu5992
看了青岛赛区的题简单学了一下kd,感觉这东西还是挺厉害的 一般kd树找最近点对最坏是O(n),但是随机情况下跑得还是很快的 kd树是一棵BST,但是每一层的关键字不同 一般写法是按照每一维轮流来,这一 ...
- 【BZOJ1941】Hide and Seek(KD-Tree)
[BZOJ1941]Hide and Seek(KD-Tree) 题面 BZOJ 洛谷 题解 \(KD-Tree\)对于每个点搜一下最近点和最远点就好了 #include<iostream> ...
- 【BZOJ1941】[Sdoi2010]Hide and Seek KDtree
[BZOJ1941][Sdoi2010]Hide and Seek Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了 ...
- KD-Tree复习笔记(BZOJ1941 & BZOJ2648 & BZOJ4066)
快一年了都没碰到什么必须用KDT的题目导致模板完全忘光了,重新复习了一下. K_Dimention_Tree是一种用来处理二维以上问题的数据结构(OI中一般都是二维),本质是二维启发式估价函数实现剪枝 ...
- [bzoj1941][Sdoi2010]Hide and Seek_KD-Tree
Hide and Seek bzoj-1941 Sdoi-2010 题目大意:给出平面上n个点,选出一个点,使得距离这个点的最远点曼哈顿距离减去距离这个点的最近非己点的曼哈顿距离最小.输出最小曼哈顿距 ...
- 【BZOJ-1941】Hide and Seek KD-Tree
1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 830 Solved: 455[Submi ...
- 【bzoj1941】【Sdoi2010】Hide and Seek
---恢复内容开始--- Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡 ...
随机推荐
- C++11 并发指南三(std::mutex 详解)(转)
转自:http://www.cnblogs.com/haippy/p/3237213.html 上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::th ...
- ZipOutputStream 用法 小计
ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFile)); 构造函数之后 文件就已经创建出来了 只是 0kb s.Write(bu ...
- Amazon SNS移动推送更新——新增百度云推送和Windows平台支持
Amazon SNS(Simple Notification Service)是一种基于云平台的消息通知和推送服务. SNS提供简单的 Web 服务接口和基于浏览器的管理控制台让用户可以简易设置.执行 ...
- shell脚本分析mysql慢查询日志(slow log)
使用percona公司的pt-query-digest分析慢查询日志.分析.统计的结果的比較清晰 #!/bin/sh slowlog_path=/root/slow_query_log everysl ...
- python--面向对象—接口
开放封闭原则依赖导致原则接口隔离原则继承多态抽象类和接口类 编程思想:为子类做规范 归一化设计:几个类都实现了相同的方法 抽象类:最好单继承,且可以简单的实现功能 接口类:可以多继承,且最好不实 ...
- 关于angular JS 中$timeOut 的一些不正常情况下的$destory
最近项目中存在的问题头疼脑热了好一会. 我先简单说明下问题是由,使用$timeOut循环调用的时候由于页面存在异步加载会出现反复执行循环反复调用$timeOut,怎么清除跳出循环都不管用.于是查到了如 ...
- windows下的txt格式转换成linux下的TXT
存在的问题是 多出一个方框或者黑格子 主要是因为bash 不能忽略windows的问题 用sed 命令来处理,分别是windows转linux,linux转windows sed -e 's/.$// ...
- vi 之行号操作---显示行号、跳到指定行
1.设置行号显示 esc ->:->set nu 2.跳到指定行 esc-> 123gg 3. 进入命令模式 ?一:在冒号下输入 vim vi 在命令模式中 使用 d(版本不同 使用 ...
- 2016/08/18 select
1.//得到select项的个数 2.jQuery.fn.size = function(){ 3. return jQuery(this).get(0).options.length; 4.} 5. ...
- EasyDarwin流媒体服务器高性能优化方向
我们在EasyDarwin开源流媒体服务器上做了很多的优化,包括前面说到的<EasyDarwin开源流媒体服务器将select改为epoll的方法>.<EasyDarwin开源流媒体 ...