HDU 4643 GSM(二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4643

题意:给出平面上n的信号发射站。已知在任意一点接受信号时都是从最近的信号发射站接收。给出两点a和b。求从a走到b需要改变多少次信号接收站。

思路:如下图所示,属于每个信号站管辖的范围必然是一个凸包。那么若某两个点的颜色相同,则中间不会改变信号接收站。因此,当两点的颜色不同时,可二分中点,继续判断。

HDU 4643 GSM(二分)

 






struct point
{
    double x,y;
    
    point(){}
    point(double _x,double _y)
    {
        x=_x;
        y=_y;
    }
    
    void get()
    {
        RD(x,y);
    }
    
    point operator+(point a)
    {
        return point(x+a.x,y+a.y);
    }
    
    point operator-(point a)
    {
        return point(x-a.x,y-a.y);
    }
    
    point operator/(double t)
    {
        return point(x/t,y/t);
    }
    
    double len()
    {
        return sqrt(x*x+y*y);
    }
};


point a[N],b[N];
int n,m,K;


int sgn(double x)
{
    if(x>EPS) return 1;
    if(x<-EPS) return -1;
    return 0;
}


int get(point a)
{
    double dis=dinf,temp;
    int x,i;
    FOR1(i,m)
    {
        temp=(a-b[i]).len();
        if(sgn(temp-dis)==-1) dis=temp,x=i;
    }
    return x;
}


int DFS(point a,point b,int x,int y)
{
    if(sgn((a-b).len())<=0) return 1;
    if(x==-1) x=get(a);
    if(y==-1) y=get(b);
    if(x==y) return 0;
    return DFS(a,(a+b)/2,x,-1)+DFS((a+b)/2,b,-1,y);
}




int main()
{
    Rush(n)
    {
        RD(m);
        int i;
        FOR1(i,n) a[i].get();
        FOR1(i,m) b[i].get();
        RD(K);
        int x,y;
        while(K--)
        {
            RD(x,y);
            PR(DFS(a[x],a[y],-1,-1)/2);
        }
    }
}





你可能感兴趣的:(HDU)