这题真tm是醉了。

就是对于每个亲戚,利用其它的亲戚对他半平面交求出其控制的范围,然后随便跑个最短路就行了

n=0卡了我一下午//////

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define N 666
#define eps 1e-12
using namespace std;
int g[N][N];
struct point{
double x[];
point(){}
point(double a,double b){x[]=a,x[]=b;}
double & operator [] (int a){return x[a];}
}p[N];
double dis(point a,point b){
return sqrt((b[]-a[])*(b[]-a[])+(b[]-a[])*(b[]-a[]));
}
struct line{
double a,b,c,k;
int id;
line(){}
line (double x,double y,double z,int pos){
a=x;b=y;c=z;
k=atan2(-x,y);id=pos;
}
void rev(){
a=-a;b=-b;c=-c;
k=atan2(-a,b);
}
}l[N],q[N];
int T,n,bot,tot,top,be,ans;
double wx,wy,sx,sy,d;
bool cmp(line a,line b){
if(fabs(a.k-b.k)<eps)return a.c<b.c;
return a.k<b.k;
}
point cross(line a,line b){
double x=(b.c*a.b-a.c*b.b)/(a.a*b.b-a.b*b.a);
double y=(b.c*a.a-a.c*b.a)/(a.b*b.a-a.a*b.b);
return point(x,y);
}
bool judge(point a,line b){
return a[]*b.a+a[]*b.b+b.c<-eps;
}
void addline (point a,point b,int id){
point c=point((a[]+b[])/,(a[]+b[])/);
if(a[]==b[])l[++tot]=line(0.0,1.0,-c[],id);
else if(a[]==b[])l[++tot]=line(1.0,0.0,-c[],id);
else l[++tot]=line(1.0,(b[]-a[])/(b[]-a[]),-c[]-(b[]-a[])/(b[]-a[])*c[],id);
if(judge(a,l[tot]))l[tot].rev();
}
void work(int x){
register int i,j;
sort(l+,l+tot+,cmp);
for(i=,j=;i<=tot;i++)
if(fabs(l[i].k-l[j].k)>=eps)l[++j]=l[i];
tot=j;
bot=;top=;
q[]=l[];q[]=l[];
for(i=;i<=tot;i++){
while(bot<top&&judge(cross(q[top-],q[top]),l[i]))top--;
while(bot<top&&judge(cross(q[bot+],q[bot]),l[i]))bot++;
q[++top]=l[i];
}
while(bot<top&&judge(cross(q[top-],q[top]),q[bot]))top--;
for(i=bot;i<=top;i++){
if(q[i].id)g[x][q[i].id]=g[q[i].id][x]=;
else g[x][n+]=g[n+][x]=;
}
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
if(!n){puts("");continue;}
memset(g,0x3f,sizeof g);
scanf("%lf%lf%lf%lf",&wx,&wy,&sx,&sy);
for(int i=;i<=n;i++)
scanf("%lf%lf",&p[i][],&p[i][]);
for(int i=;i<=n;i++){
tot=;
for(int j=;j<=n;j++)if(j!=i)
addline(p[i],p[j],j);
addline(p[i],point(-p[i][],p[i][]),);
addline(p[i],point(p[i][],-p[i][]),);
addline(p[i],point(*wx-p[i][],p[i][]),);
addline(p[i],point(p[i][],*wy-p[i][]),);
work(i);
}
d=g[][];ans=;
for(int i=;i<=n;i++){
double now=dis(point(sx,sy),p[i]);
if(now<d)d=now,be=i;
}
for(int k=;k<=n+;k++)
for(int i=;i<=n+;i++)
for(int j=;j<=n+;j++)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
ans=g[be][n+]+;
printf("%d\n",ans);
}
return ;
}

bzoj3199 [Sdoi2013]escape的更多相关文章

  1. [BZOJ3199][SDOI2013]escape:半平面交

    分析 好像叫V图什么的. 容易发现,对于每个点,其监视的范围就是这个点与其它所有点的垂直平分线分割平面后的半平面交.由于数据范围很小,所以我们可以直接枚举每个点,使用双端队列求出其监视的范围.若两个点 ...

  2. BZOJ3199 SDOI2013 逃考 半平面交、最短路

    传送门 如果我们对于每一个点能找到与其相邻的点(即不经过其他点监视范围能够直接到达其监视范围的点)和是否直接到达边界,就可以直接BFS求最短路求出答案. 所以当前最重要的问题是如何找到对于每一个点相邻 ...

  3. bzoj AC倒序

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

  4. 【JZOJ3297】【SDOI2013】逃考(escape)

    Mission 高考又来了,对于不认真读书的来讲真不是个好消息.为了小杨能在家里认真读书,他的亲戚决定驻扎在他的家里监督他学习,有爷爷奶奶.外公外婆.大舅.大嫂.阿姨-- 小杨实在是忍无可忍了,这种生 ...

  5. ACM: Gym 101047E Escape from Ayutthaya - BFS

    Gym 101047E Escape from Ayutthaya Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I6 ...

  6. 简单明了区分escape、encodeURI和encodeURIComponent

    一.前言 讲这3个方法区别的文章太多了,但是大部分写的都很绕.本文试图从实践角度去讲这3个方法. 二.escape和它们不是同一类 简单来说,escape是对字符串(string)进行编码(而另外两种 ...

  7. c#模拟js escape方法

    public static string Escape(string s) { StringBuilder sb = new StringBuilder(); byte[] ba = System.T ...

  8. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 960  Solved: 5 ...

  9. 【BZOJ-1340】Escape逃跑问题 最小割

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

随机推荐

  1. 运行Applet程序

    [操作方法1:]① 编辑源程序welcome.java.② 编译程序 javac welcome.java③ 将Applet嵌入HTML网页.方法是,用记事本创建一个文件,文件内容如下:<app ...

  2. python redis模块的常见的几个类 Redis 、StricRedis和ConnectionPool

    日常写代码过程中,经常需要连接redis进行操作.下面我就介绍下python操作redis模块redis中的几个常见类,包括redis连接池. 一.StrictRedis 类 请看代码:. #!/us ...

  3. Coursera-AndrewNg(吴恩达)机器学习笔记——第三周

    一.逻辑回归问题(分类问题) 生活中存在着许多分类问题,如判断邮件是否为垃圾邮件:判断肿瘤是恶性还是良性等.机器学习中逻辑回归便是解决分类问题的一种方法.二分类:通常表示为yϵ{0,1},0:&quo ...

  4. 分布式单点登录框架XXL-SSO

    <分布式单点登录框架XXL-SSO> 一.简介 1.1 概述 XXL-SSO 是一个分布式单点登录框架.只需要登录一次就可以访问所有相互信任的应用系统. 拥有"轻量级.分布式.跨 ...

  5. D3中的each() 以及svg defs元素 clipPath的使用

    each() 方法允许我们定制对选择集中DOM元素的处理行为: selection . each ( func ) 参数 func 是调用者定义的函数,在d3中被称为 访问器/accessor . d ...

  6. 学习笔记 C++ 链表

    今天查了不少关于链表的资料大概理解了链表,为记录只用留笔于此. 链表概述:动态的数据存储单元,可以比数组更加灵活. 链表的组成:存储的数据,下一个节点. 首先让我们用代码完成一个节点. class N ...

  7. python 编码形式简单入门

    为什么使用Python 假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200. 思路:用shell编程.(Linux通常是 ...

  8. Python强大的格式化format

    原文地址:http://www.jb51.net/article/63672.htm 自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型 ...

  9. msql索引

    从网上找了两种解决方案: 最近要给一个表加一个联合唯一索引,但是表中的两个联合健有重复值,导致无法创建: 解决方案一:ignore(会删除重复的记录(重复记录只保留一条,其他的删除),然后建立唯一索引 ...

  10. 基于ubuntu16.04部署IBM开源区块链项目-弹珠资产管理(Marbles)

    前言 本教程基本上是对Marbles项目的翻译过程. 如果英文比较好的话,建议根据官方操作说明,一步步进行环境部署.当然你也可以参考本教程在自己的主机上部署该项目. Marbles 介绍 关于 Mar ...