Description

小猪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的问题。

Input

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

Output

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

题解: 求对于每个点最远距离-最近距离的最小值, 依次枚举距离每个点最远距离与最近距离即可.

#include<bits/stdc++.h>
#define maxn 200000
#define inf 1000000000
using namespace std;
void getmin(int &a,int b) { if(b<a) a=b; }
void getmax(int &a,int b) { if(b>a) a=b; }
void setIO(string s)
{
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
freopen(out.c_str(),"w",stdout);
}
namespace KDtree
{
#define lson t[x].ch[0]
#define rson t[x].ch[1]
#define mid ((l+r)>>1)
int d,ansmin,ansmax,answer;
struct Node
{
int ch[2],minv[2],maxv[2],p[2];
}t[maxn],T;
bool cmp(Node a,Node b)
{
if(a.p[d] == b.p[d]) return a.p[d^1] < b.p[d^1];
return a.p[d] < b.p[d];
}
void pushup(int o,int x)
{
getmin(t[o].minv[0], t[x].minv[0]);
getmax(t[o].maxv[0], t[x].maxv[0]);
getmin(t[o].minv[1], t[x].minv[1]);
getmax(t[o].maxv[1], t[x].maxv[1]);
}
int build(int l,int r,int o)
{
d=o;
nth_element(t+l,t+mid,t+1+r,cmp);
t[mid].minv[0]=t[mid].maxv[0]=t[mid].p[0];
t[mid].minv[1]=t[mid].maxv[1]=t[mid].p[1];
t[mid].ch[0]=t[mid].ch[1]=0;
if(l<mid)
{
t[mid].ch[0]=build(l,mid-1,o^1);
pushup(mid,t[mid].ch[0]);
}
if(r>mid)
{
t[mid].ch[1]=build(mid+1,r,o^1);
pushup(mid,t[mid].ch[1]);
}
return mid;
}
int _min(Node a)
{
int ans=0;
for(int i=0;i<2;++i)
{
ans += max(T.p[i]-a.maxv[i], 0);
ans += max(a.minv[i]-T.p[i], 0);
}
return ans;
}
int _max(Node a)
{
int ans=0;
for(int i=0;i<2;++i)
{
ans += max(abs(T.p[i]-a.minv[i]), abs(T.p[i]-a.maxv[i]));
}
return ans;
}
void qmin(int x,int x1,int y1)
{
int dn=abs(t[x].p[0]-x1) + abs(t[x].p[1]-y1),dl,dr;
if(dn>0) getmin(ansmin,dn);
dl=lson?_min(t[lson]):inf;
dr=rson?_min(t[rson]):inf;
if(dl<dr)
{
if(dl<ansmin) qmin(lson,x1,y1);
if(dr<ansmin) qmin(rson,x1,y1);
}
else
{
if(dr<ansmin) qmin(rson,x1,y1);
if(dl<ansmin) qmin(lson,x1,y1);
}
}
void qmax(int x,int x1,int y1)
{
int dn=abs(t[x].p[0]-x1) + abs(t[x].p[1]-y1),dl,dr;
getmax(ansmax, dn);
dl=lson?_max(t[lson]):-inf;
dr=rson?_max(t[rson]):-inf;
if(dl>dr)
{
if(dl>ansmax) qmax(lson,x1,y1);
if(dr>ansmax) qmax(rson,x1,y1);
}
else
{
if(dr>ansmax) qmax(rson,x1,y1);
if(dl>ansmax) qmax(lson,x1,y1);
}
}
void solve(int i,int rt)
{
T=t[i], ansmin=inf,ansmax=-inf;
qmin(rt, T.p[0], T.p[1]);
qmax(rt, T.p[0], T.p[1]);
getmin(answer, ansmax-ansmin);
}
};
int main()
{
//setIO("A");
int n,root,i;
KDtree::answer=inf;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d%d",&KDtree::t[i].p[0],&KDtree::t[i].p[1]);
root=KDtree::build(1,n,0);
for(i=1;i<=n;++i)
{
KDtree::solve(i,root);
}
printf("%d\n",KDtree::answer);
return 0;
}

  

BZOJ 1941: [Sdoi2010]Hide and Seek KDtree + 估价函数的更多相关文章

  1. bzoj 1941 [Sdoi2010]Hide and Seek——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1941 第二道KDtree! 枚举每个点,求出距离它的最远和最近距离.O( n * logn ...

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

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

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

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

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

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

  5. 【54.08%】【BZOJ 1941】Hide and Seek

    Time Limit: 16 Sec  Memory Limit: 162 MB Submit: 919  Solved: 497 [Submit][Status][Discuss] Descript ...

  6. 【bzoj1941】[Sdoi2010]Hide and Seek KD-tree

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

  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. 【bzoj1941】[Sdoi2010]Hide and Seek(kd-tree)

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

随机推荐

  1. HDU 1814 Peaceful Commission(2-sat 模板题输出最小字典序解决方式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814 Problem Description The Public Peace Commission ...

  2. 浅谈API网关(API Gateway)如何承载API经济生态链

    序言 API经济生态链已经在全球范围覆盖, 绝大多数企业都已经走在数字化转型的道路上,API成为企业连接业务的核心载体, 并产生巨大的盈利空间.快速增长的API规模以及调用量,使得企业IT在架构上.模 ...

  3. Codeforces Round #272 (Div. 2)C. Dreamoon and Sums 数学推公式

    C. Dreamoon and Sums   Dreamoon loves summing up something for no reason. One day he obtains two int ...

  4. 速度上手LM4F LaunchPad 输出多路PWM波

    最近转战到TI的Cortex M4平台后,发现网上关于TI的LM4F120 Launchpad 资料太少了,而且其中大部分都是TI员工或者其合作伙伴提供的,例程太少,导致新手上手很慢. 我只是要实现几 ...

  5. IE浏览器 多版本之间切换

    由于Win7系统最低支持IE8的版本,不能通过安装IE7版本来达到要求. 有一个替代方案,通过IE自带Emulation来实现,实现步骤如下: 打开现有的IE浏览器 按下F12键 切换到“Emulat ...

  6. ios13--购物车优化

    // // ViewController.m // 03-综合练习 // #import "ViewController.h" @interface ViewController ...

  7. Android开发:setAlpha()方法

    paint.setAlpha() 即透明度.其取值范围是0---255,数值越小,越透明,颜色上表现越淡. 实际上当设成10以下就会有透明的效果了.

  8. 让ListView回来原来的位置

    让ListView回到原来的位置 当从ListView中的某一个Item跳转到其他的Activity,进行操作之后,ListView可能需要刷新(重新加载数据源),这个时候ListView就会回到原始 ...

  9. Linux音频驱动-ALSA概述

    概述 ALSA(Advanced Linux Sound Architecture)是linux上主流的音频结构,在没有出现ALSA架构之前,一直使用的是OSS(Open Sound System)音 ...

  10. 特征变化--->标签到向量的转换(OneHotEncoder)

    一.One-Hot Encoding     One-Hot编码,又称为一位有效编码,主要是采用位状态寄存器来对个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效.     在实 ...