【JZOJ5094】【GDSOI2017第四轮模拟day3】鸽子 计算几何+floyd
题面
养鸽人要监视他的鸽子,有n只鸽子站在平面上,他可以在m个给定的点上设置监视器,如果一只鸽子在某个监视器上或者在两个监视器所连直线上或者在三个监视器所连直线的三角形内则其就咕咕咕了,现在养鸽人要让所有鸽子咕咕咕,请问他最少需要设置多少监视器。
对于100%的数据n≤100000,m≤500,坐标绝对值不超过10的9次方。
100
首先转化一下题意,就是选取尽量少的点,然后生成一个凸包,包住给定的一个凸包。
显然在给定凸包内的点是没有用处的。
对于不在给定凸包内的点,我们枚举它们:
对于一个点i,找出其与给定凸包的两条“切线”。
如图,两条切线即为x,y,那么就有使\(i\)给图中蓝色的点连一条长度为1的边。
由于凸包是,一个点出发,回到这个点的最短路。
然后做一遍floyd就可以了。
Code
#include<bits/stdc++.h>
#define ll long long
#define db double
#define fo(i,x,y) for(int i=x;i<=y;i++)
#define fd(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
const int inf=0x7fffffff;
const char* fin="pigeon.in";
const char* fout="pigeon.out";
const int maxn=100007,maxm=507;
const db eps=1e-10;
int equ(db v,db c){return (fabs(v-c)<eps?0:(v<c?-1:1));}
struct P{
db x,y;
P(db _x=0,db _y=0){x=_x;y=_y;}
P operator +(const P &b)const{return P(x+b.x,y+b.y);}
P operator -(const P &b)const{return P(x-b.x,y-b.y);}
db operator ^(const P &b)const{return x*b.y-b.x*y;}
db arg()const{return atan2(y,x);}
void ni(){x=-x;y=-y;}
void p(){printf("%lf %lf\n",x,y);}
}a[maxn],b[maxm],c[maxn];
int n,m,N,f[maxm][maxm];
void floyd(){
fo(k,1,m) fo(i,1,m) fo(j,1,m)
if (f[i][k]<2000000000 && f[k][j]<2000000000)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%d%d",&n,&m);
fo(i,1,n) scanf("%lf%lf",&a[i].x,&a[i].y);
fo(i,1,m) scanf("%lf%lf",&b[i].x,&b[i].y);
memset(f,127,sizeof f);
bool debug=false;
fo(i,1,m){
int mxid=0,mnid=0,lid=0,hid=0;
db low,high;
P mx,mn;
fo(j,1,n){
if (a[j].x==b[i].x && a[j].y==b[i].y) continue;
db x=(a[j]-b[i])^(a[1]-b[i]);
P tmp=(a[j]-b[i]);
if (mxid==0 || equ(mx^tmp,0)>0) mx=tmp,mxid=j;
if (mnid==0 || equ(mn^tmp,0)<0) mn=tmp,mnid=j;
if (hid==0 || high<x) high=x,hid=j;
if (lid==0 || low>x) low=x,lid=j;
}
if (equ((a[hid]-b[i])^(a[lid]-b[i]),0)<0) continue;
P da=mx,xiao=mn;
if (debug) xiao.p(),da.p();
da.ni();
fo(j,1,m)
if (i!=j){
P tmp=b[j]-b[i];
if (debug){
tmp.p();//printf(":%lf %lf\n",xiao^tmp,tmp^da);
printf(":%d %d\n",equ(xiao^tmp,0)<=0,equ(tmp^da,0)<=0);
}
if (equ(xiao^tmp,0)<=0 && equ(tmp^da,0)<=0) f[i][j]=1;
}
if (debug)printf("\n");
}
floyd();
int ans=inf;
fo(i,1,m) ans=min(ans,f[i][i]);
if (ans<2000000000) printf("%d",ans);
else printf("-1");
return 0;
}
【JZOJ5094】【GDSOI2017第四轮模拟day3】鸽子 计算几何+floyd的更多相关文章
- 【JZOJ5093】【GDSOI2017第四轮模拟day3】字符串匹配 哈希
题面 对于一个字符集大小为C的字符串P,我们可以将任意两种字符在P中的位置进行互换,例如P=abcba,我们交换a,b就变为bacab,交换a,d就变为dbcbd,交换可以进行任意次.若交换后P变为了 ...
- [第一波模拟\day3\T3]{益智游戏}(game.cpp)
[问题描述] 小P和小R在玩一款益智游戏.游戏在一个正权有向图上进行. 小P控制的角色要从A点走最短路到B点,小R控制的角色要从C点走最短路到D点. 一个玩家每回合可以有两种选择,移动到一个相邻节点或 ...
- [第一波模拟\day3\T2]{独立集}(bubble.cpp)
[问题描述] 有一天,一个名叫顺旺基的程序员从石头里诞生了.又有一天,他学会了冒泡排序和独立集.在一个图里,独立集就是一个点集,满足任意两个点之间没有边.于是他就想把这两个东西结合在一起.众所周知,独 ...
- HNOI模拟 Day3.25 By Yqc
怕老婆 [问题描述] 有一天hzy9819,来到了一座大城市拥有了属于他自己的一双滑板鞋.但是他还是不满足想要拥有属于自己的一栋楼,他来到了一条宽敞的大道上,一个一个记录着这些楼的层数以方便自己选择. ...
- HNOI模拟 Day3.23
一.拓扑(top)[ 题目描述]:给你一个有向二分图,求他的拓扑序列的个数.[ 输入]:第一行两个数 N,M,表示点数和边数.接下来 M 行每行两个数 a,b,表示 a 向 b 有一条有向边.[ 输出 ...
- HNOI模拟 Day3.22
第一题: 盾盾的打字机 (drdrd) [题目描述] 盾盾有一个非常有意思的打字机,现在盾哥要用这台打字机来打出一段文章. 由于有了上次的经验,盾盾预先准备好了一段模板 A 存在了内存中,并以此为基础 ...
- 【JZOJ5088】【GDOI2017第四轮模拟day2】最小边权和 排序+动态规划
题面 有一张n个点m条边的有向图,每条边有一个互不相同的边权w,有q个询问,要求你从点a经过不超过c条边到点b,要求经过的边权递增并和尽量小,求出最小的边权和,如果没有合法方案则输出-1. 对于100 ...
- 【JZOJ5086】【GDOI2017第四轮模拟day1】数列 折半搜索
题面 有一个长度为n 的排列,现在有一些位置的数已经模糊不清了,你只知道这个排列的逆序对个数是K,你能计算出总共有多少可能的排列吗? 对于100% 的数据,n <=10^3,K<=10^9 ...
- 【JZOJ5081】【GDSOI2017第三轮模拟】Travel Plan 背包问题+双指针+树的dfs序
题面 100 注意到ban的只会是一个子树,所以我们把原树转化为dfs序列. 然后题目就转化为,询问一段ban的区间,之后的背包问题. 比赛的时候,我想到这里,于是就开始想区间合并,于是搞了线段树合并 ...
随机推荐
- vue.js组件的个人总结
vue.js的组件使用过程分为三个步骤:1.创建组件构造器: 2.注册组件: 3.使用组件 组件同时也分为全局组件与局部组件 1.全局组件 2.局部组件 注意:由于 HTML 标签不区分大小写,所以在 ...
- transform函数
C++学习[原创]transform函数的应用 transform(first,last,result,op);//first是容器的首迭代器,last为容器的末迭代器,result为存放结果的容器, ...
- oslo_messaging使用eventlet executor时rpc无法调用的问题
python2.7.5 oslo.messaging==9.8.0 现象: 从debug日志可以看到rpcServer接收到了rabbitmq的消息, 但是没有调用endpoints中的相应方法 分析 ...
- LINUX软件包的安装、升级、删除
1.安装和升级一个rpm 包: [root@localhost beinan]#rpm -vih file.rpm 注:这个是用来安装一个新的rpm 包: [root@localhost beinan ...
- 线性求所有数模p的乘法逆元
推理: 假如当前计算的是x在%p意义下的逆元,设$p=kx+y$,则 $\Large kx+y\equiv 0(mod\ p)$ 两边同时乘上$x^{-1}y^{-1}$(这里代表逆元) 则方程变为$ ...
- UVAL3700
Interesting Yang Hui Triangle 题目大意:杨辉三角第n + 1行不能整除p(p是质数)的数的个数 题解: lucas定理C(n,m) = πC(ni,mi) (mod p) ...
- Luogu P1979 华容道(bfs+最短路)
P1979 华容道 题意 题目描述 小B最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成, 最少需要多少时间. ...
- mac下更改MySQL的默认编码
mysql默认的编码是latin1,它不支持中文,所以我们一般需要修改他的默认编码格式. 打开终端1. 进入root权限sudo -i 2. cp /usr/local/mysql/support-f ...
- TZ_05_Spring_annotation常见注解
Spring常用的注解大全和解释 注解 解释 @Controller 组合注解(组合了@Component注解),应用在MVC层(控制层),DispatcherServlet会自动扫描注解了此注解的类 ...
- 华为 Mate8 Emui 5.0 安卓 7.0 root 记录
步骤: 0.备份手机全部资料 1.华为官网申请解锁码 (unlock password) http://emui.huawei.com/plugin/hwdownload/download 2.关闭手 ...