题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3199

题意:给出n个点。对于平面上任意一点p,p到n个点中的哪个点的距离最近我们就称p就被哪个点控制。有可能p被多个点同时控制(距离相等的时候)。给出一个矩形框(0,0,X,Y)以及框内一点q。从q到达矩形框上的途中,最少被多少个点控制过?

思路:n个点中的每个点有一个控制区域。某个点和其他点中垂线组成的半平面交就是这个区域。这个可以用凸包计算。这里是一个nlogn求凸包的算法,第二次遇到这个算法,第一次是:

http://www.cnblogs.com/jianglangcaijin/archive/2013/03/07/2947784.html

然后就是有公共边的连边求最短路。

point S,p[N];

struct Tline
{
    point p1,p2;
    int id;
    double ang;
    Tline(){}

    Tline(point _p1,point _p2,int _id)
    {
        p1=_p1;
        p2=_p2;
        ang=atan2(p2.y-p1.y,p2.x-p1.x);
        id=_id;
    }
}L[N];

point crossPoint(Tline l1,Tline l2)
{
    double ta=(l1.p2-l2.p1)*(l1.p1-l2.p1);
    double tb=(l1.p1-l2.p2)*(l1.p2-l2.p2);
    return (l2.p1*tb+l2.p2*ta)/(ta+tb);
}

double xx,yy;
int n,tot;

double dist(const point &a)
{
    return sqrt(a.x*a.x+a.y*a.y);
}

int cmp(const Tline &a,const Tline &b)
{
    if(sgn(a.ang-b.ang)==0) return sgn((a.p1-b.p1)*(b.p2-b.p1))<0;
    return sgn(a.ang-b.ang)<0;
}

int onleft(const Tline &l1,const Tline &l2,const Tline &l3)
{
    point tp=crossPoint(l1,l2);
    return sgn((l3.p2-l3.p1)*(tp-l3.p1))>=0;
}

vector<int> g[N];

void hpi(int x)
{
    sort(L+1,L+1+tot,cmp);
    int i,tp=1;
    for(i=2;i<=tot;i++) if(sgn(L[i].ang-L[i-1].ang)!=0) L[++tp]=L[i];
    tot=tp;

    int front=1,rear=1;
    int Q[N];
    Q[1]=1;

    for(i=2;i<=tot;i++)
    {
        while(front<rear&&!onleft(L[Q[rear-1]],L[Q[rear]],L[i]))rear--;
        while(front<rear&&!onleft(L[Q[front]],L[Q[front+1]],L[i]))front++;
        Q[++rear]=i;
    }
    while(front<rear&&!onleft(L[Q[rear-1]],L[Q[rear]],L[Q[front]]))rear--;
    while(front<rear&&!onleft(L[Q[front]],L[Q[front+1]],L[Q[rear]]))front++;

    if(rear-front<2)return;
    for(i=front;i<=rear;i++)
    {
        int y=L[Q[i]].id;
        g[x].pb(y);
    }
}

void work(int x)
{
    tot=0;
    L[++tot]=Tline(point(0,0),  point(xx,0), n+1);
    L[++tot]=Tline(point(xx,0), point(xx,yy),n+1);
    L[++tot]=Tline(point(xx,yy),point(0,yy), n+1);
    L[++tot]=Tline(point(0,yy), point(0,0),  n+1);
    int i;
    for(i=1;i<=n;i++) if(i!=x)
    {
        point S=(p[i]+p[x])/2;
        point d=(p[i]-p[x]).zhuanNi(PI/2);
        point T=S+d;
        L[++tot]=Tline(S,T,i);
    }
    hpi(x);
}

int bfs(int st)
{
    queue<int> Q;
    Q.push(st);

    int i,dis[N],visit[N];
    for(i=1;i<=n+1;i++) dis[i]=1e9,visit[i]=0;

    dis[st]=0;
    visit[st]=1;

    while(!Q.empty())
    {
        int u=Q.front();
        Q.pop();

        for(i=0;i<SZ(g[u]);i++)
        {
            int v=g[u][i];
            if(!visit[v])
            {

                visit[v]=1;
                dis[v]=dis[u]+1;
                Q.push(v);
            }
        }
    }
    return dis[n+1];
}

int main()
{
    int T=getInt();
    while(T--)
    {
        n=getInt();
        xx=getInt(),yy=getInt();
        S.get();

        int i;
        for(i=1;i<=n;i++)p[i].get(),g[i].clear();

        for(i=1;i<=n;i++) work(i);

        int st=1;
        double tmp=dist(p[1]-S);
        for(i=2;i<=n;i++) if(dist(p[i]-S)<tmp)
        {
            tmp=dist(p[i]-S);
            st=i;
        }
        printf("%d\n",bfs(st));
    }
    return 0;
}

BZOJ 3199 escape的更多相关文章

  1. BZOJ 1340: [Baltic2007]Escape逃跑问题

    1340: [Baltic2007]Escape逃跑问题 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 285  Solved: 133[Submit] ...

  2. POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)

    POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. BZOJ 3940: [Usaco2015 Feb]Censoring

    3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 173[Subm ...

  5. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  6. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  7. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  8. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  9. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

随机推荐

  1. [JAVA]在linux中设置JDK环境,ZendStudio,Eclipse

    1.准备JDK安装包 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载对应平台的tar.gz格式压 ...

  2. 【ubuntu】首选项和应用程序命令(preference & application)

     gnome-control-center  系统设置  gnome-control-center region  键盘布局  gnome-control-center screen  屏幕  gno ...

  3. Fragement

    package com.exmple.frage; import java.util.ArrayList; import java.util.Calendar; import java.util.Ha ...

  4. #import vs. @class

    You #import or #include when there is a physical dependency. Otherwise, you use forward declarations ...

  5. 创建sh文件

    创建sh文件 #/bin/bash v_file=$ v_type=$ v_desc=$ touch $v_file echo '#================================== ...

  6. Oracle游标练手实例

    --声明游标:CURSOR cursor_name IS select_statement --For循环游标 --(1)定义游标 --(2)定义游标变量 --(3)使用for循环来使用这个游标 de ...

  7. 输入框焦点时自动清除value

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <script typ ...

  8. samba服务器源码安装(非rpm)

    首先我们创建一个文档,边安装配置samba,边写教程. 从www.samba.org下载samba最新源码包,我下载的是samba-3.0.7.tar.gz,把它放在我的目录的中/root/lova/ ...

  9. 浅谈mysql mvcc

    以下为个人理解,如有错误,还望指正!! mysql的大多数事务型存储引擎实现的都不是简单的行级锁,基于提升并发性能的考虑,他们一般都同时实现了多版本并发控制,可以认为MVCC是行级锁的一个变种,但是它 ...

  10. python: html 笔记2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...