洛谷 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来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
随机推荐
- CSS3选择器之:nth-child(n)
第一次用到这个选择器还是为了解决下面了的问题: 手机的前端,我们使用了mint-ui,里面有一个日期选择控件,但是选择的时候没有提供年月的选择器,如: 而是提供了下面的方式: 为了达到上面的效果,使用 ...
- Python基础(函数,函数的定义,函数的调用,函数的参数,递归函数)
1.函数 我们知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = ...
- [Spark][Python]RDD flatMap 操作例子
RDD flatMap 操作例子: flatMap,对原RDD的每个元素(行)执行函数操作,然后把每行都“拍扁” [training@localhost ~]$ hdfs dfs -put cats. ...
- 【强化学习】python 实现 q-learning 例二
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10134855.html 问题情境 一个2*2的迷宫,一个入口,一个出口,还有一个陷阱.如图 ...
- .net core 中使用httpclient,HttpClientFactory的问题
Microsoft 在.Net Framework 4.5中引入了HttpClient,并且是在.NET服务器端代码中使用Web API的最常用方法.但它有一些严重的问题,如释放HttpClient对 ...
- 仓储层接口IBaseRepository解析
//代码调用由业务层调用,调用方式详见源代码的业务层,升级直接替换TT模板即可,无需覆盖系统using System; using System.Collections.Generic; using ...
- React Native 教程:001 - 如何运行官方控件示例 App
原文发表于我的技术博客 本文主要讲解了如何运行 React Native 官方控件示例 App,包含了一些 React Native 的基础知识以及相关环境的配置. 原文发表于我的技术博客 React ...
- MariaDB 安装与启动 过程记录
1. 安装之前的准备工作 rpm -qa |grep mysql rpm -qa |grep mariadb 按照查出来的软件包使用 yum remove 全部卸载,当然也可以 yum remov ...
- JavaScript术语:shim 和 polyfill
转自:https://www.html.cn/archives/8339 在学习和使用 JavaScript 的时候,我们会经常碰到两个术语:shim 和 polyfill.它们有许多定义和解释,意思 ...
- Week7阅读笔记
关于银弹: Brooks在他最著名的这篇文章里指出,在软件开发过程里是没有万能的终杀性武器的,只有各种方法综合运用,才是解决之道.而各种声称如何如何神奇的理论或方法,都不是能杀死“软件危机”这头人狼的 ...