题目描述

小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏。 但是,他们觉得,玩普通的捉迷藏没什么意思,还是不够寂寞,于是,他们决定玩寂寞无比的螃蟹版捉迷藏,顾名思义,就是说他们在玩游戏的时候只能沿水平或垂直方向走。一番寂寞的剪刀石头布后,他们决定iPig去捉giPi。由于他们都很熟悉PKU的地形了,所以giPi只会躲在PKU内n个隐秘地点,显然iPig也只会在那n个地点内找giPi。游戏一开始,他们选定一个地点,iPig保持不动,然后giPi用30秒的时间逃离现场(显然,giPi不会呆在原地)。然后iPig会随机地去找giPi,直到找到为止。由于iPig很懒,所以他到总是走最短的路径,而且,他选择起始点不是随便选的,他想找一个地点,使得该地点到最远的地点和最近的地点的距离差最小。iPig现在想知道这个距离差最小是多少。 由于iPig现在手上没有电脑,所以不能编程解决这个如此简单的问题,所以他马上打了个电话,要求你帮他解决这个问题。iPig告诉了你PKU的n个隐秘地点的坐标,请你编程求出iPig的问题。

输入

第一行输入一个整数N 第2~N+1行,每行两个整数X,Y,表示第i个地点的坐标

输出

一个整数,为距离差的最小值。

样例输入

4
0 0
1 0
0 1
1 1

样例输出

1


题解

KD-tree

如果我们已经知道了一个固定的点,那么很容易求出距离它最远和最近的点。

于是我们可以枚举已知的点,使用KD-tree求出与一个点距离最近和最远(好像可以贪心)的点。

其中求最远的估价函数和最近点稍有区别,自己yy一下就好。

注意求最近点时要忽略相同的点。

#include <cstdio>
#include <algorithm>
#define N 1000010
#define inf 0x7fffffff
using namespace std;
struct data
{
int p[2] , minn[2] , maxn[2] , c[2];
}a[N];
int d , root , ans;
bool cmp(data a , data b)
{
return a.p[d] == b.p[d] ? a.p[d ^ 1] < b.p[d ^ 1] : a.p[d] < b.p[d];
}
void pushup(int k , int s)
{
a[k].minn[0] = min(a[k].minn[0] , a[s].minn[0]);
a[k].minn[1] = min(a[k].minn[1] , a[s].minn[1]);
a[k].maxn[0] = max(a[k].maxn[0] , a[s].maxn[0]);
a[k].maxn[1] = max(a[k].maxn[1] , a[s].maxn[1]);
}
int build(int l , int r , int now)
{
int mid = (l + r) >> 1;
d = now , nth_element(a + l , a + mid , a + r + 1 , cmp);
a[mid].minn[0] = a[mid].maxn[0] = a[mid].p[0];
a[mid].minn[1] = a[mid].maxn[1] = a[mid].p[1];
if(l < mid) a[mid].c[0] = build(l , mid - 1 , now ^ 1) , pushup(mid , a[mid].c[0]);
if(r > mid) a[mid].c[1] = build(mid + 1 , r , now ^ 1) , pushup(mid , a[mid].c[1]);
return mid;
}
int getmin(int k , int x)
{
int ret = 0;
if(a[x].p[0] < a[k].minn[0]) ret += a[k].minn[0] - a[x].p[0];
if(a[x].p[0] > a[k].maxn[0]) ret += a[x].p[0] - a[k].maxn[0];
if(a[x].p[1] < a[k].minn[1]) ret += a[k].minn[1] - a[x].p[1];
if(a[x].p[1] > a[k].maxn[1]) ret += a[x].p[1] - a[k].maxn[1];
return ret;
}
int getmax(int k , int x)
{
return max(abs(a[k].maxn[0] - a[x].p[0]) , abs(a[k].minn[0] - a[x].p[0])) + max(abs(a[k].maxn[1] - a[x].p[1]) , abs(a[k].minn[1] - a[x].p[1]));
}
void querymin(int k , int x)
{
int dn = abs(a[k].p[0] - a[x].p[0]) + abs(a[k].p[1] - a[x].p[1]) , dl = inf , dr = inf;
if(dn && dn < ans) ans = dn;
if(a[k].c[0]) dl = getmin(a[k].c[0] , x);
if(a[k].c[1]) dr = getmin(a[k].c[1] , x);
if(dl < dr)
{
if(dl < ans) querymin(a[k].c[0] , x);
if(dr < ans) querymin(a[k].c[1] , x);
}
else
{
if(dr < ans) querymin(a[k].c[1] , x);
if(dl < ans) querymin(a[k].c[0] , x);
}
}
void querymax(int k , int x)
{
int dn = abs(a[k].p[0] - a[x].p[0]) + abs(a[k].p[1] - a[x].p[1]) , dl = 0 , dr = 0;
if(dn > ans) ans = dn;
if(a[k].c[0]) dl = getmax(a[k].c[0] , x);
if(a[k].c[1]) dr = getmax(a[k].c[1] , x);
if(dl > dr)
{
if(dl > ans) querymax(a[k].c[0] , x);
if(dr > ans) querymax(a[k].c[1] , x);
}
else
{
if(dr > ans) querymax(a[k].c[1] , x);
if(dl > ans) querymax(a[k].c[0] , x);
}
}
int main()
{
int n , ret = inf , tmp , i;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d%d" , &a[i].p[0] , &a[i].p[1]);
root = build(1 , n , 0);
for(i = 1 ; i <= n ; i ++ )
ans = inf , querymin(root , i) , tmp = ans , ans = 0 , querymax(root , i) , ret = min(ret , ans - tmp);
printf("%d\n" , ret);
return 0;
}

【bzoj1941】[Sdoi2010]Hide and Seek KD-tree的更多相关文章

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

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

  2. 【bzoj1941】 Sdoi2010—Hide and Seek

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

  3. 【bzoj1941】[Sdoi2010]Hide and Seek(kd-tree)

    bzoj 题意: 给出\(n\)个点,对于每个点,\(d_i\)等于距离其最远的点的距离减去距离最近的点的距离.这里的距离为曼哈顿距离. 求\(min\{d_i\}\). 思路: 考虑直接对每个点暴力 ...

  4. BZOJ1941:[SDOI2010]Hide and Seek(K-D Tree)

    Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏- ...

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

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

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

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

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

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

  8. [BZOJ1941][Sdoi2010]Hide and Seek

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

  9. bzoj:1941: [Sdoi2010]Hide and Seek

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

随机推荐

  1. SAP C4C Opportunity和SAP ERP Sales流程的集成

    首先在C4C里创建一个新的Opportunity: 给这个Opportunity添加一个新的产品: 点按钮:Request Pricing, 从ERP抓取pricing数据,点按钮之前Negotiat ...

  2. UVA 1149 Bin Packing 装箱(贪心)

    每次选最大的物品和最小的物品放一起,如果放不下,大物体孤独终生,否则相伴而行... 答案变得更优是因为两个物品一起放了,最大的物品是最难匹配的,如果和最小的都放不下的话,和其它匹配也一定放不下了. # ...

  3. UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)

    题意:有n支队伍(n是2的整数幂,2<=n<=4),打淘汰赛,胜者进入下一轮,其中1号队伍能打败至少一半的队伍,对于它不能打败的队伍l,一定存在一支它能够打败的队伍w,使得w能直接打败l, ...

  4. spring-data-JPA源码解读

    spring-data-JPA源码部分有两个很重要的部分:1.识别repositories接口 2.将接口添加代理实现类并托管spring管理 JpaRepositoriesRegistrar 目的是 ...

  5. C# 调用腾讯地图WebService API获取距离(一对多)

    官方文档地址:https://lbs.qq.com/webservice_v1/guide-distance.html 代码: /// <summary> /// 获取距离最近的点的经纬度 ...

  6. CF-1140 E - Palindrome-less Arrays

    题意:给定一个没有填完的序列,数值为-1表示你可以用 1~k 中的数字去覆盖它,求将该序列填充后,不存在长度为奇数的回文串的方案数 分析: 使之不存在长度为奇数的回文串,只需要满足不存在长度为3的回文 ...

  7. 扫雷游戏 NOIP(入门)

    题目描述: 扫雷游戏是一款十分经典的单机小游戏.它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷. 现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷 ...

  8. GoF23种设计模式之行为型模式之命令模式

    一.概述 将一个请求封装为一个对象,从而可以使用不同的请求对客户端进行参数化.对请求排队或记录请求日志,以及支持撤销的操作. 二.适用性 1.当抽象出待执行的动作以参数化某个对象的时候. 2.当需要在 ...

  9. LeetCode(260) Single Number III

    题目 Given an array of numbers nums, in which exactly two elements appear only once and all the other ...

  10. flask-mail(qq邮箱)

    from flask_mail import Mail,Message app.config['MAIL_SERVER']='smtp.qq.com' app.config['MAIL_PORT'] ...