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]逃考 解题报告的更多相关文章

  1. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  2. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  3. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  4. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  5. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  6. 洛谷 P3225 [HNOI2012]矿场搭建 解题报告

    P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...

  7. 洛谷 P1462 通往奥格瑞玛的道路 解题报告

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  8. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  9. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

随机推荐

  1. zookeepeer4字命令实践

    环境 leader:192.168.116.143 fllower:192.168.116.142 fllower:192.168.116.144 命令:conf——查看其他主机的配置文件 [root ...

  2. EZ 2018 06 02 NOIP2018 模拟赛(十七)

    这次的比赛是真心比较狗,我TM的写了30min的树剖ZZ地直接memset超时了 话说我既然想到差分就应该去写差分的啊! 好了不过这次Rank还挺高的,终于要打进前10了当然是假的了. 好了下面开始讲 ...

  3. GitFlow原理浅析

    一.Git优点 分布式存储 , 本地仓库包含了远程仓库的所有内容 . 安全性高 , 远程仓库文件丢失了也不怕 优秀的分支模型 , 创建/合并分支非常的方便 方便快速 , 由于代码本地都有存储 , 所以 ...

  4. 【react】使用 create-react-app 构建基于TypeScript的React前端架构----上

    写在前面 一直在探寻,那优雅的美:一直在探寻,那精湛的技巧:一直在探寻,那简单又直白,优雅而美丽的代码. ------ 但是在JavaScript的动态类型.有时尴尬的自动类型转换,以及 “0 == ...

  5. Zabbix监控系统部署:前端初始化

    1. 概述 在上一篇博客<Zabbix监控系统部署:源码安装.md>中,主要进行了zabbix最新版的源码编译安装. (博客园地址:https://www.cnblogs.com/liwa ...

  6. C/C++中int128的那点事

    最近群友对int128这个东西讨论的热火朝天的.讲道理的话,编译器的gcc是不支持__int128这种数据类型的,比如在codeblocks 16.01/Dev C++是无法编译的,但是提交到大部分O ...

  7. RDMA技术解析

    文章出处:https://mp.weixin.qq.com/s/pW-tQR4AYr1Gtd4dpHVW7w 摘要:远程直接内存访问(即Remote Direct Memory Access)是一种直 ...

  8. Lotto HDU

    链接 [http://acm.hdu.edu.cn/showproblem.php?pid=1342] 题意 分析 DFS 代码 #include<cstdio> #include< ...

  9. 个人博客作业_week7

    心得 在为期将近一个月的团队编程中,给我感受最深的是敏捷开发和团队中队员之间的互补. 在最初的软件开发中,由于以前没有这方面的经验,所以并没有很大的进展.在慢慢过度中,我们找到了自己的节奏感,大家各自 ...

  10. 毕业设计 之 五 PHP语法学习笔记

    毕业设计 之 四 PHP语法学习笔记 作者:20135216 平台:windows10 软件:XAMPP,DreamWeaver 说明:该笔记是对网站编程语言的详细学习 一.PHP基础 0. 关于环境 ...