BZOJ 3199 escape
题目链接: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的更多相关文章
- BZOJ 1340: [Baltic2007]Escape逃跑问题
1340: [Baltic2007]Escape逃跑问题 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 285 Solved: 133[Submit] ...
- POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)
POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 3940: [Usaco2015 Feb]Censoring
3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 367 Solved: 173[Subm ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
随机推荐
- python添加tab键提示
新建一个tab.py脚本 #!/usr/bin/python import sys import readline import rlcompleter import atexit import os ...
- 转一篇 adaboost 的好文 AdaBoost简介及训练误差分析
AdaBoost简介及训练误差分析 http://wenku.baidu.com/link?url=y9Q2qjrJr6IShyY5EQEmvkPZmmP4t3HOdHUgMWaIffI9W0uzTr ...
- PAT乙级 1015. 德才论 (25)
1015. 德才论 (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Li 宋代史学家司马光在<资治通鉴&g ...
- getResource().getPath()返回的路径空格变成了 %20
this.getClass().getResource(“/”).getPath()使用者方法查看文件在服务器上的地址,但是地址中的空格会被转化为%20. 解决办法1: URI uri = new U ...
- FastJson--阿里巴巴公司开源的速度最快的Json和对象转换工具(转)
本文转自:http://blog.csdn.net/djun100/article/details/24237371 这是关于FastJson的一个使用Demo,在Java环境下验证的 class U ...
- linux设备驱动归纳总结(六):1.中断的实现【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-90740.html linux设备驱动归纳总结(六):1.中断的实现 xxxxxxxxxxxxxxxx ...
- Tutorial: WPF User Control for AX2012
原作者: https://community.dynamics.com/ax/b/goshoom/archive/2011/10/06/tutorial-wpf-user-control-for-ax ...
- Install MongoDB on Red Hat Enterprise, CentOS, Fedora, or Amazon Linux
Install MongoDB on Red Hat Enterprise, CentOS, Fedora, or Amazon Linux¶ Overview Use this tutorial t ...
- 【jqGrid for ASP.NET MVC Documentation】.学习笔记.7.搜索过滤数据
1 基础 搜索和过滤功能,是使用确定的条件,查找匹配行数据.jqGrid提供几种搜索模式: Search Dialog 单搜索选项 Search Dialog 多搜索选项 ToolBar Search ...
- 织梦系统中出现DedeTag Engine Create File False提示原因及解决方法
今天更新网站时dedecms系统时,遇到一个问题:DedeTag Engine Create File False 出现这样的提示. 其实这也不算是什么错误,我个人觉得最重要的一点就是根目录下没有给 ...