bzoj:1941: [Sdoi2010]Hide and Seek

1941: [Sdoi2010]Hide and Seek

Time Limit: 16 Sec  Memory Limit: 162 MB
Submit: 531  Solved: 295
[Submit][Status][Discuss]

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

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

Sample Input

4
0 0
1 0
0 1
1 1

Sample Output

1

噗,这不是k-d树模版么,好像没怎么写过……

于是我敲啊敲,敲啊敲……233……TLE+WA

然后我开始膜黄学长代码……

噗,好像差不多……

于是我开始调……从来没写过的算法果然细节上出了很多问题……

调了一天……

A啦……

并没有什么用……

#include<cstdio>
#include<algorithm>
using namespace std;

int n,m,nu,ans=1e9,ma,mi,ka,ki,X,ro,xx;
struct tr{
    int x,y;
    friend bool operator<(tr a,tr b){
        if (X) return a.x<b.x;else return a.y<b.y;
    }
};
struct tree{
    int xa,xi,ya,yi,ye,l,r;
    tree(){
        l=r=xa=ya=ye=0;
        xi=yi=1e9;
    }
};
tr a[500011];
tree t[500011];
char cs;
inline int read(){
    cs=getchar();xx=0;
    while(cs<‘0‘||cs>‘9‘) cs=getchar();
    while(cs>=‘0‘&&cs<=‘9‘) xx=xx*10+cs-48,cs=getchar();
    return xx;
}
inline bool cmx(tr x,tr y){
    return x.x<y.x;
}
inline bool cmy(tr x,tr y){
    return x.y<y.y;
}
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
inline int abs(int x){return x<0?-x:x;}
inline int jl(int x,int y){
    return abs(a[x].x-a[y].x)+abs(a[x].y-a[y].y);
}
inline int build(int l,int r,int now){
    X=now;
    int mid=(l+r)>>1;
    t[mid].ye=1;
    nth_element(a+l,a+mid,a+r+1);
    t[mid].xa=t[mid].xi=a[mid].x;
    t[mid].ya=t[mid].yi=a[mid].y;
    if (l<mid) t[mid].l=build(l,mid-1,now^1),
    t[mid].xa=max(t[t[mid].l].xa,t[mid].xa),
    t[mid].xi=min(t[t[mid].l].xi,t[mid].xi),
    t[mid].ya=max(t[t[mid].l].ya,t[mid].ya),
    t[mid].yi=min(t[t[mid].l].yi,t[mid].yi);
    if (mid<r) t[mid].r=build(mid+1,r,now^1),
    t[mid].xa=max(t[t[mid].r].xa,t[mid].xa),
    t[mid].xi=min(t[t[mid].r].xi,t[mid].xi),
    t[mid].ya=max(t[t[mid].r].ya,t[mid].ya),
    t[mid].yi=min(t[t[mid].r].yi,t[mid].yi);
    return mid;
}
inline int gm(int i,int j){return max(abs(t[j].xa-a[i].x),abs(t[j].xi-a[i].x))+max(abs(t[j].ya-a[i].y),abs(t[j].yi-a[i].y));}
inline int gn(int i,int j){return max(a[i].x-t[j].xa,0)+max(-a[i].x+t[j].xi,0)+max(a[i].y-t[j].ya,0)+max(-a[i].y+t[j].yi,0);}
inline void qa(int i,int x){
    if (x!=i) ma=max(ma,jl(i,x)),ka++;
    int dl=-1,dr=-1;
    if (t[x].l) dl=gm(i,t[x].l);
    if (t[x].r) dr=gm(i,t[x].r);
    if (dl>dr){
        if (dl>ma) qa(i,t[x].l);
        if (dr>ma) qa(i,t[x].r);
    }else{
        if (dr>ma) qa(i,t[x].r);
        if (dl>ma) qa(i,t[x].l);
    }
}
inline void qi(int i,int x){
    if (x!=i) mi=min(mi,jl(i,x)),ki++;
    int dl=1e9,dr=1e9;
    if (t[x].l) dl=gn(i,t[x].l);
    if (t[x].r) dr=gn(i,t[x].r);
    if (dl>dr){
        if (dr<mi) qi(i,t[x].r);
        if (dl<mi) qi(i,t[x].l);
    }else{
        if (dl<mi) qi(i,t[x].l);
        if (dr<mi) qi(i,t[x].r);
    }
}
int main(){
    n=read();
    register int i;
    for (i=1;i<=n;i++) a[i].x=read(),a[i].y=read();
    ro=build(1,n,0);
    for (i=1;i<=n;i++)
    {
        ma=0;mi=1e9;
        qa(i,ro);qi(i,ro);
        if (ma-mi<ans) ans=ma-mi;
    }
    printf("%d\n",ans);
}
时间: 2024-10-24 15:41:28

bzoj:1941: [Sdoi2010]Hide and Seek的相关文章

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

Time Limit: 16 Sec  Memory Limit: 162 MBSubmit: 1712  Solved: 932[Submit][Status][Discuss] Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏. 但是,他们觉得,玩普通的捉迷藏没什么意思,还是不够寂寞,于是,他们决定玩寂寞无比的螃蟹版捉迷藏,顾名思义

K-D树:bzoj 1941: [Sdoi2010]Hide and Seek (板子)

1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #define ls(x) a[x].l 6 #define rs(x) a[x].r 7 using namespace std; 8 const int N=500066; 9 int abss(int x){return x<0?-x:x;} 10 int maxn(int a,i

BZOJ 1941 Sdoi2010 Hide and Seek K-Dimensional-Tree

题目大意:给定平面上的n个点,定义距离为曼哈顿距离,求一个点到其他所有点的最大距离与最小距离之差最小 KDTree--这东西好神啊 注意计算最小距离的时候不能把自己也算进去= = #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 500500 #define INF 0x3f3f3f3f using namespace std; st

bzoj1941 [Sdoi2010]Hide and Seek

Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏. 但是,他们觉得,玩普通的捉迷藏没什么意思,还是不够寂寞,于是,他们决定玩寂寞无比的螃蟹版捉迷藏,顾名思义,就是说他们在玩游戏的时候只能沿水平或垂直方向走.一番寂寞的剪刀石头布后,他们决定iPig去捉giPi.由于他们都很熟悉PKU的地形了,所以giPi只会躲在PKU内n个隐秘地点,显然

【bzoj1941】 Sdoi2010—Hide and Seek

http://www.lydsy.com/JudgeOnline/problem.php?id=1941 (题目链接) 题意 给出n个二维平面上的点,求一点使到最远点的距离-最近点的距离最小. Solution KDtree板子,早就听jump说KDtree都是板子题→_→ 枚举点,求其最远点距离和最近点距离,更新答案.最远邻近域搜索跟最近差不多,就是把估价函数改一下. 细节 码农题注意细节 代码 // bzoj1941 #include<algorithm> #include<iost

【kd-tree】bzoj1941 [Sdoi2010]Hide and Seek

枚举每个点,计算离他最近的和最远的点. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define N 500001 #define INF 2147483647 #define KD 2//ά¶ÈÊý int qp[KD],disn,disx; int n,root; bool dn; struct Node { int minn[KD],maxx[KD],p[K

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

题目描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏. 但是,他们觉得,玩普通的捉迷藏没什么意思,还是不够寂寞,于是,他们决定玩寂寞无比的螃蟹版捉迷藏,顾名思义,就是说他们在玩游戏的时候只能沿水平或垂直方向走.一番寂寞的剪刀石头布后,他们决定iPig去捉giPi.由于他们都很熟悉PKU的地形了,所以giPi只会躲在PKU内n个隐秘地点,显然iPig也只会

【BZOJ】【1941】【SDOI2010】Hide and Seek

KD-Tree 一开始看错题了 其实是:给定n个点,从中找一个点,使得其他所有点到它距离的最大值与最小值之差最小. 利用KD-Tree暴力求出每个点的答案(找离它最近的点以及最远的点(当然只关心距离)) 然后……两个过程分开写…… 注意一下最近的点的距离不能是0(然而我一开始用 if (o==tmp) return INF; 就WA了……)(这里o是当前搜索到的点,tmp是枚举的起始点) 1 /***************************************************

【BZOJ-1941】Hide and Seek KD-Tree

1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec  Memory Limit: 162 MBSubmit: 830  Solved: 455[Submit][Status][Discuss] Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏. 但是,他们觉得,玩普通的捉迷藏没什么意思,还是