题目链接: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. Oracle存储过程总结

    1.存储过程结构 1.1 第一个存储过程 create or replace procedure proc1( para1 varchar2, para2 out varchar2, para3 in ...

  2. async fifo

    异步fifo,解决跨时钟域的数据传输问题. 由binary,gray两种counter组成,在读写domain之间,只传输gray code. 主要的设计难点在empty和full的产生中. empt ...

  3. Bug测试报告--俄罗斯方块--新蜂

    项目名:俄罗斯方块 组名:新蜂 测试者:韩媛媛(nice!团队) 用户需求规格说明书URL:http://www.cnblogs.com/Boxer1994/p/6084035.html 组长博客UR ...

  4. zw版【转发·台湾nvp系列Delphi例程】HALCON CheckDifference

    zw版[转发·台湾nvp系列Delphi例程]HALCON CheckDifference unit Unit1;interfaceuses Windows, Messages, SysUtils, ...

  5. ubuntu android环境配置

    1.下载eclipse 2.下载sdk 3.安装adt 4.配置sdk环境路径sudo gedit /etc/profile export PATH=$JAVA_HOME/bin:$JAVA_HOME ...

  6. android 学习随笔二十八(应用小知识点小结 )

    去掉标题栏的方法 第一种:也一般入门的时候经常使用的一种方法requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏注意这句一定要写在setConte ...

  7. web.xml完整配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java ...

  8. 【Pro ASP.NET MVC 3 Framework】.学习笔记.1.主要语言特性

    C# 是一个富有特性的语言,并不是所有的程序员都熟悉本书依赖的所有特性.在本章,我们看看作为一个好的MVC程序员需要知道的C#特性. 1 C#主要特性 } 1.1 使用扩展方法 扩展方法 在你不能拥有 ...

  9. Linux中重定向命令行

    http://www.ahlinux.com/start/base/3170.html

  10. ACM第二站————归并排序

    转载请注明出处,谢谢!http://www.cnblogs.com/Asimple/p/5459664.html 归并排序————二分的思想 以中间的数为基准,每次排序都将比其小[升序排](大[降序排 ...