BZOJ 1941: [Sdoi2010]Hide and Seek KDtree + 估价函数
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 + 估价函数的更多相关文章
- bzoj 1941 [Sdoi2010]Hide and Seek——KDtree
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1941 第二道KDtree! 枚举每个点,求出距离它的最远和最近距离.O( n * logn ...
- bzoj:1941: [Sdoi2010]Hide and Seek
1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 531 Solved: 295[Submi ...
- BZOJ 1941: [Sdoi2010]Hide and Seek(k-d Tree)
Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 1712 Solved: 932[Submit][Status][Discuss] Descripti ...
- 【BZOJ1941】[Sdoi2010]Hide and Seek KDtree
[BZOJ1941][Sdoi2010]Hide and Seek Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了 ...
- 【54.08%】【BZOJ 1941】Hide and Seek
Time Limit: 16 Sec Memory Limit: 162 MB Submit: 919 Solved: 497 [Submit][Status][Discuss] Descript ...
- 【bzoj1941】[Sdoi2010]Hide and Seek KD-tree
题目描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏. ...
- 【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
[BZOJ1941][Sdoi2010]Hide and Seek 试题描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他 ...
- 【bzoj1941】[Sdoi2010]Hide and Seek(kd-tree)
bzoj 题意: 给出\(n\)个点,对于每个点,\(d_i\)等于距离其最远的点的距离减去距离最近的点的距离.这里的距离为曼哈顿距离. 求\(min\{d_i\}\). 思路: 考虑直接对每个点暴力 ...
随机推荐
- Erlang下与其他程序和语言的通信机制(2)
前面聊了普通端口,今天聊下链入式驱动端口,以及NIFs. 链入式驱动端口 如上图所示,链入式驱动端口与Erlang虚拟机存在于同一个OS进程中. 在Erlang这边与普通端口类似,所有与链入式驱动端口 ...
- LeetCode 893. Groups of Special-Equivalent Strings (特殊等价字符串组)
题目标签:String 题目可以让在 偶数位置的 chars 互换, 也可以让 在 奇数位置的 chars 互换. 所以为了 return 正确的 group 数量,需要把 那些重复的 给排除掉. 可 ...
- P1830 轰炸III
P1830 轰炸III 84通过 145提交 题目提供者wanglichao1121 标签模拟矩阵洛谷原创 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目背景 一个大小为N ...
- Java之正則表達式【使用语法】
认为好就顶一个!! ! ! 3.正則表達式 用一些特殊的有意义的字符组成的字符串(死记) 原子:正則表達式的最基本组成单位 正則表達式特殊意义的字符: . * + ?不能单独表示它们,假设非 ...
- 在C#中实现listbox的项上下移动(winform) 标准
在C#中实现listbox的项上下移动(winform) 收藏人:梅毛子360 2013-10-02 | 阅:1 转:2 | 分享 | 来源 usi ...
- Codeforces--622A--Infinite Sequence(数学)
Infinite Sequence Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:26214 ...
- PCB SQL SERVER 字段模糊匹配个数 实现方法
今天工程系统给到加投加投组件的数据规则修改,遇到需将一个字段模糊匹配的个数统计 这类需求要平时应该很少遇到了,这里将此方法分享出来, 一.需求如下 例子:itempara字段中的内容是: IVH板 铜 ...
- codevs3728联合权值(LCA)
3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 输入描述 Input Des ...
- 微信小程序之上传多张图片
之前写过一篇小程序商品发布的博客,里面有上传多张图片的功能,这里单独拿出来实现以下,小程序的upLoadFile一次只能上传一张图片,需要循环调这个接口来实现 for (var i = 0; i &l ...
- c++ pow函数
函数名称: pow 函数原型: double pow( double x, double y ); 函数功能: 计算x的y次幂 例:z=pow(x,y); x=9,y=8 z就是9 ...