洛谷 P3297 [SDOI2013]逃考 解题报告
P3297 [SDOI2013]逃考
题意
给一个平面矩形,里面有一些有标号点,有一个是人物点,人物点会被最近的其他点控制,人物点要走出矩形,求人物点最少被几个点控制过。
保证一开始只被一个点控制,没有点在矩阵边界上
多组数据\(t\le 3\),点数\(\le600\)。
画一画图可以发现
对每个点,这个点和另一个点的垂直平分线可以划分这两个点的控制区域,每个点搞出\(n-1\)个垂直平分线,然后加上边界的四条,做半平面交,然后对每个点向最后半平面交留下的线所代表的点连边,跑最短路就可以了,复杂度\(O(n^2\log n)\)
一些细节,交点坐标别瞎用fabs,要判平行
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
const int N=610;
const double eps=1e-6;
int head[N],to[N*N],Next[N*N],cnt;
void add(int u,int v){to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;}
#define Point Vector
struct Vector
{
double x,y;
Vector(){}
Vector(double X,double Y){x=X,y=Y;}
double angle(){return atan2(y,x);}
Vector friend operator +(Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}
Vector friend operator -(Vector a,Vector b){return Vector(a.x-b.x,a.y-b.y);}
Vector friend operator *(Vector a,double b){return Vector(a.x*b,a.y*b);}
}q2[N],bee[N],yuy;
double Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;}
bool dcmp(double a,double b){return fabs(b-a)<eps;}
struct Line
{
Point s,t;int id;double ang;
Line(){}
Line(Point S,Point T){s=S,t=T,ang=(t-s).angle();}
bool friend operator <(Line a,Line b){return dcmp(a.ang,b.ang)?Cross(b.t-a.s,a.t-a.s)+eps>0:a.ang<b.ang;}
}Li[N],q1[N];
Point getmid(Point a,Point b){return Point((a.x+b.x)/2,(a.y+b.y)/2);}
Vector Rotate(Vector a){return Vector(a.y,-a.x);}
Line getl(Point a,Point b)
{
Point c=getmid(a,b);
return Line(c,c+Rotate(b-a));
}
Point jd(Line a,Line b){return b.s+(b.t-b.s)*(Cross(b.s-a.s,a.t-a.s)/Cross(a.t-a.s,b.t-b.s));}
bool isrig(Line a,Point b){return Cross(b-a.s,a.t-a.s)+eps>0;}
int ct,st;
void SI(int u)
{
std::sort(Li+1,Li+1+ct);
int l,r;
q1[l=r=1]=Li[1];
for(int i=2;i<=ct;i++)
{
if(dcmp(Li[i].ang,Li[i-1].ang)) continue;
while(l<r&&isrig(Li[i],q2[r-1])) --r;
while(l<r&&isrig(Li[i],q2[l])) ++l;
q2[r]=jd(Li[i],q1[r]);
q1[++r]=Li[i];
}
while(l<r&&isrig(q1[l],q2[r-1])) --r;
while(l<r&&isrig(q1[r],q2[l])) ++l;
for(int i=l;i<=r;i++) add(u,q1[i].id);
if(r-l<2) return;
int flag=1;
for(int i=l;i<=r;i++)
if(isrig(q1[i],yuy))
flag=0;
if(flag) st=u;
}
double sx,sy;
int dis[N],used[N],n,T,q[N];
void init(int id)
{
ct=0;Point d1=Point(0,0),d2=Point(sx,0),d3=Point(sx,sy),d4=Point(0,sy);
Li[++ct]=Line(d1,d2),Li[++ct]=Line(d2,d3),Li[++ct]=Line(d3,d4),Li[++ct]=Line(d4,d1);
for(int i=1;i<=4;i++) Li[i].id=n+1;
for(int i=1;i<=n;i++)
if(i!=id)
Li[++ct]=getl(bee[i],bee[id]),Li[ct].id=i;
}
void work()
{
memset(head,0,sizeof head),cnt=0;
scanf("%d",&n);
scanf("%lf%lf%lf%lf",&sx,&sy,&yuy.x,&yuy.y);
for(int i=1;i<=n;i++) scanf("%lf%lf",&bee[i].x,&bee[i].y);
for(int i=1;i<=n;i++) init(i),SI(i);
memset(dis,0,sizeof dis);
memset(used,0,sizeof used);
int l,r;
used[q[l=r=1]=st]=1;
while(l<=r)
{
int now=q[l++];
for(int v,i=head[now];i;i=Next[i])
if(!used[v=to[i]])
used[q[++r]=v]=1,dis[v]=dis[now]+1;
}
printf("%d\n",dis[n+1]);
}
int main()
{
scanf("%d",&T);
while(T--) work();
return 0;
}
2019.2.11
洛谷 P3297 [SDOI2013]逃考 解题报告的更多相关文章
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
- 洛谷 P3225 [HNOI2012]矿场搭建 解题报告
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- 洛谷 P1462 通往奥格瑞玛的道路 解题报告
P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...
- 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
随机推荐
- SRP周记_20190418
SRP的全名是Student research project (我猜的),对于部分学生来说,不做就相当于不能毕业,一个project大概做一年左右,算是我工的一个特色.本人参加的SRP是做一个编译原 ...
- HNOI2019 多边形 polygon
HNOI2019 多边形 polygon https://www.luogu.org/problemnew/show/P5288 这题镪啊... 首先堆结论: 显然终止状态一定是所有边都连向n了 根据 ...
- koa2入门(2) koa-router 路由处理
项目地址:https://github.com/caochangkui/demo/tree/koa-test 1. 创建项目 创建目录 koa-test npm init 创建 package.jso ...
- python语言程序设计9
1, 数字转换形式中有很多东西都不会,但是总不能放仍不管把? 总结点东西吧,比如 print()中增加end=""参数表示输入后不增加换行,多个print可以连续输出. 2, 我还 ...
- Azure Load Balancer : 简介
Azure 提供的负载均衡服务叫 Load Balancer,它工作在 ISO 七层模型的第四层,通过分析 IP 层及传输层(TCP/UDP)的流量实现基于 "IP + 端口" 的 ...
- Ionic 中控件点击延迟的处理
原文发表于我的技术博客 本文分享了在 Ionic 中如何处理控件点击延迟的问题. 原文发表于我的技术博客 1. 问题描述 在 Ionic 中,当在 iOS 环境下运行元素的点击事件时,你会发现点击响应 ...
- CF 1047 C. Enlarge GCD
传送门 [http://codeforces.com/contest/1047/problem/C] 题意 给你n个数,移除最少的数字使剩下的数字GCD大于初始GCD 思路 需要一点暴力的技巧,先求出 ...
- 【补充】第一次个人项目出现的bug
新程序包下载(密码:4kp6) >>>>>直接上代码,问题出在随机分数的生成上,确实出现了一些非常鱼唇的错误,不过已经提交了就没办法了,在这里发出来仅供参考吧: 修改前: ...
- WebAPI实例--第一个API
今天终于做了第一个任务,学习API之后的第一个实例.销售设置开发API. 第一.层次结构 1.API各层 项目结构主要有五层,分别为API.BizModel.Data.DBModel.Logic. 2 ...
- Sprint 冲刺第三阶段第6-10天
这几天一直都在整理我们之前的内容,检查会不会有细节问题.例如界面跳转.颜色等. 因为一直没办法找到guitub存放位置.于是在这里存放一些主代码. MainActivity.java package ...