bzoj3199 [Sdoi2013]escape
这题真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的更多相关文章
- [BZOJ3199][SDOI2013]escape:半平面交
分析 好像叫V图什么的. 容易发现,对于每个点,其监视的范围就是这个点与其它所有点的垂直平分线分割平面后的半平面交.由于数据范围很小,所以我们可以直接枚举每个点,使用双端队列求出其监视的范围.若两个点 ...
- BZOJ3199 SDOI2013 逃考 半平面交、最短路
传送门 如果我们对于每一个点能找到与其相邻的点(即不经过其他点监视范围能够直接到达其监视范围的点)和是否直接到达边界,就可以直接BFS求最短路求出答案. 所以当前最重要的问题是如何找到对于每一个点相邻 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【JZOJ3297】【SDOI2013】逃考(escape)
Mission 高考又来了,对于不认真读书的来讲真不是个好消息.为了小杨能在家里认真读书,他的亲戚决定驻扎在他的家里监督他学习,有爷爷奶奶.外公外婆.大舅.大嫂.阿姨-- 小杨实在是忍无可忍了,这种生 ...
- ACM: Gym 101047E Escape from Ayutthaya - BFS
Gym 101047E Escape from Ayutthaya Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I6 ...
- 简单明了区分escape、encodeURI和encodeURIComponent
一.前言 讲这3个方法区别的文章太多了,但是大部分写的都很绕.本文试图从实践角度去讲这3个方法. 二.escape和它们不是同一类 简单来说,escape是对字符串(string)进行编码(而另外两种 ...
- c#模拟js escape方法
public static string Escape(string s) { StringBuilder sb = new StringBuilder(); byte[] ba = System.T ...
- BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 960 Solved: 5 ...
- 【BZOJ-1340】Escape逃跑问题 最小割
1340: [Baltic2007]Escape逃跑问题 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 264 Solved: 121[Submit] ...
随机推荐
- C# 中的线程安全集合类
C# 的集合类型中, 都有Synchronized静态方法, 和SyncRoot实例方法 对于ArrayList以及Hashtable 集合类来讲,当需要做到线程安全的时候,最好利用其自带的属性Syn ...
- c#实例化继承类,必须对被继承类的程序集做引用
0x00 问题 类型“Model.NewModel”在未被引用的程序集中定义.必须添加对程序集“Model, Version=1.0.0.0, Culture=neutral, PublicKeyTo ...
- two sum II
Given an array of integers that is already sorted in ascending order, find two numbers such that the ...
- ssh优缺点
面试归来 技术面试官叫我谈谈 ssh优缺点 平时用起来倒是挺顺手..但是从来没有系统的总结过..导致很多点会都没有说出来.. 这次我认真总结了一下... 常说的好处 开源 常说的坏处 配置文件过大我就 ...
- Android之动画
Android的动画可以分为三种,View动画.帧动画.属性动画.View动画通过对场景里的对象不断做图像变化(平移.缩放.旋转.透明度)从而产生动画效果,它是一种渐进式动画,而且View动画支持自定 ...
- Nuget发布教程
nuget setApiKey Your-API-Key -Source https://www.nuget.org/api/v2/package nuget spec nuget pack Monk ...
- ThinkPHP简单的验证码实现
ThinkPHP简单的验证码实现 写一个最简单的TP验证码. 写Controller 首先在Controller/IndexController.class.php(简称Index)文件中编辑: &l ...
- 当配置 DispatcherServlet拦截“/”,SpringMVC访问静态资源的三种方式
如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...
- python的统一编码规范
请注意这一点:没有编码规范的代码没有阅读价值,也更谈不上复用. 目前业界比较流行的Python的编码规范目前主要有PEP8的编程.Google的编码风格.Python Guide和Pocoo Styl ...
- 异步任务spring @Async注解源码解析
1.引子 开启异步任务使用方法: 1).方法上加@Async注解 2).启动类或者配置类上@EnableAsync 2.源码解析 虽然spring5已经出来了,但是我们还是使用的spring4,本文就 ...