正题

题目链接:https://www.ybtoj.com.cn/contest/116/problem/3


题目大意

给出两个大小分别为n,mn,mn,m的点集A,BA,BA,B。

求出BBB的一个最小子集使得该子集的凸包包含了所有点集AAA中的点。

无解输出−1-1−1

2≤n≤105,3≤m≤5002\leq n\leq 10^5,3\leq m\leq 5002≤n≤105,3≤m≤500


解题思路

选出的子集肯定是一个凸包,凸包就是相邻点连边之间的半平面交。

所以可以理解为我们要找到一些点对使得它们的半平面包含点集AAA。

如果x−>yx->yx−>y的半平面(左右都一样,反过来就是了)包含点集AAA,那么xxx向yyy连边,那么问题就变为了求图的最小环。这个可以FloydFloydFloyd解决。

如何判断一个半平面是否包含点集AAA?

一个类似旋转卡壳的想法是对于给出的这个半平面的斜率,我们在点集AAA的凸包上找到两个节点卡住它。(如下图)

然后判断这两个点是否在半平面内就好了。

挺麻烦的,再简化一下,我们将AAA的凸包用xxx坐标最大/小的两个节点分成两半,那么凸包就变成了一个上凸壳和一个下凸壳。

然后我们要找到的两个点,这个两个点肯定是一个在上一个在下的,我们根据半平面的斜率在上下凸壳上面二分一下就好了。

时间复杂度O(n+m2log⁡n+m3)O(n+m^2\log n+m^3)O(n+m2logn+m3)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+10,M=510;
struct point{ll x,y;point(ll xx=0,ll yy=0){x=xx;y=yy;return;}
}g[N],u[N],v[N],s[N],p[M];
ll n,m,uc,vc,f[M][M],h[M][M],ans;
point operator+(point a,point b)
{return point(a.x+b.x,a.y+b.y);}
point operator-(point a,point b)
{return point(a.x-b.x,a.y-b.y);}
ll operator*(point a,point b)
{return a.x*b.y-a.y*b.x;}
ll solve(point *a,ll n,ll op){ll top;s[top=1]=a[1];for(ll i=2;i<=n;i++){while(top>1&&(s[top]-s[top-1])*(a[i]-s[top-1])*op>=0)top--;s[++top]=a[i];}for(ll i=1;i<=top;i++)a[i]=s[i];return top;
}
bool check(point a,point b){ll op=1;if(a.x>b.x)swap(a,b),op=-1;ll l=1,r=uc-1;while(l<=r){ll x=(l+r)>>1;if((b-a)*(u[x+1]-u[x])>=0)l=x+1;else r=x-1; }if((b-a)*(u[l]-a)*op<0)return 0;l=1,r=vc-1;while(l<=r){ll x=(l+r)>>1;if((b-a)*(v[x+1]-v[x])<=0)l=x+1;else r=x-1;}if((b-a)*(v[l]-a)*op<0)return 0;return 1;
}
bool cmp(point a,point b)
{return a.x<b.x;}
signed main()
{freopen("lo.in","r",stdin);freopen("lo.out","w",stdout);scanf("%lld%lld",&n,&m);ll L=1,R=1;for(ll i=1;i<=n;i++)scanf("%lld%lld",&g[i].x,&g[i].y);sort(g+1,g+1+n,cmp);for(ll i=1;i<=n;i++){ll w=(g[n]-g[1])*(g[i]-g[1]);if(w>=0)u[++uc]=g[i];if(w<=0)v[++vc]=g[i];}uc=solve(u,uc,1);vc=solve(v,vc,-1);for(ll i=1;i<=m;i++)scanf("%lld%lld",&p[i].x,&p[i].y);for(ll i=1;i<=m;i++)for(ll j=1;j<=m;j++){if(i==j){h[i][j]=f[i][j]=1e9;continue;}h[j][i]=f[i][j]=check(p[i],p[j])?1:1e9;}for(ll k=1;k<=m;k++)for(ll i=1;i<=m;i++)for(ll j=1;j<=m;j++)f[i][j]=min(f[i][j],f[i][k]+f[k][j]);ans=1e9;for(ll i=1;i<=m;i++)for(ll j=1;j<=m;j++)ans=min(ans,f[i][j]+h[i][j]);if(ans>=1e9)puts("-1");else printf("%lld\n",ans);return 0;
}

YbtOJ#832-鸽子饲养【凸包,Floyd】相关推荐

  1. YBTOJ:向量问题(线段树分治、凸包)

    文章目录 题目描述 数据范围 解析 代码 题目描述 你要维护一个向量集合,支持以下操作: 插入一个向量 . 删除插入的第 x 个向量. 查询当前集合与(x,y)(x,y)(x,y) 点积的最大值是多少 ...

  2. 用鸽 计算机教案,科学活动教案:鸽子

    科学:鸽子 大班:科学<鸽子> 一.主题的产生 一天,朱老师买来了几只鸽子准备放到幼儿园的饲养角里, 在经过我们班时,就给我们班孩子看了看,问他们认不认识,孩子们一看,都非常兴奋,异口同声 ...

  3. 【渝粤题库】国家开放大学2021春2757宠物饲养题目

    试卷代号:2757 2021年春季学期期末统一考试 宠物饲养 试题 2021年7月 一.单项选择题(每小题3分,共15分) 1.下列选项中的描述不属于母猫发情表现的是( ). A.外出游荡.大声叫唤 ...

  4. BZOJ1027 [JSOI2007]合金 【计算几何 + floyd】

    题目 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的 原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金的 ...

  5. Pink Floyd -《THE WALL》 分析文章 (作者 辛迪)

    有关 THE WALL 分析文章 作者 辛迪 ?? Pink Floyd 的<The Wall>(迷墙)也许是音乐史上最具迷惑力最富想象力的专辑.<The Wall>录制于19 ...

  6. BZOJ1491: [NOI2007]社交网络(Floyd 最短路计数)

    Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2343  Solved: 1266 [Submit][Status][Discuss] Descrip ...

  7. Good Bye 2014 B. New Year Permutation(floyd )

    题目链接 题意:给n个数,要求这n个数字小的尽量放到前面,求一个最小的. 给一个矩阵s[i][j]==1,表示位置 i 的数字可以和 位置 j 的数字交换. 分析: 刚开始用的是3个循环,每次都找一个 ...

  8. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(二)寻找物体的凸包

    8.2 寻找物体的凸包 8.2.1 概念 1.给定二维平面上的点集,将最外层点连接起来构成的凸多边形. 2.理解物体形状或轮廓的一种比较有用的方法是计算一个物体的凸包,然后计算其凸缺陷(convexi ...

  9. 写到usaco上的一题可能题解是凸包所以转来这篇文章看看

    凸包 graham 算法 标签: 算法distancexpstructoutputinput 2011-09-08 12:30 8371人阅读 评论(2) 收藏 举报  分类: c++ 凸包 grah ...

最新文章

  1. 做了一个系列的Android开发教程列表
  2. repne scasb + rep movsd + rep movsb 内联实现 strcat
  3. C++调用matlab dll
  4. [笔记]极大极小过程的alpha-beta剪枝不可与记忆化搜索一起使用
  5. 三星Galaxy S21+真机上手视频曝光:外观彻底无悬念
  6. java程序组成_java程序是由什么组成的
  7. 源码阅读:SDWebImage(五)——SDWebImageFrame
  8. 关于vue的npm run dev和npm run build
  9. Eclipse的.properties文件输出中文成unicode编码
  10. Nginx负载均衡 后端服务器怎么共享Session 问题
  11. iis 6 7 8预加载,提升web访速
  12. 用Tampermonkey真正屏蔽B站自己不感兴趣的视频
  13. 解析美团联盟,美团分销联盟,美团福利宝,外卖美天赚区别和玩法
  14. java获取连续日期天数
  15. 2015.05.05,外语,读书笔记-《Word Power Made Easy》 15 “如何谈论事情进展” SESSION 42...
  16. 怎么将视频配套讲义打印出来
  17. ppt编辑器android,ppt编辑器
  18. matlab使用自带的拟合工具cftool对数据进行拟合并生成拟合函数代码
  19. [转]做个男人,做个成熟的男人,做个有城府的男人
  20. 20220316_Scanner、匿名对象、Random、ArrayList

热门文章

  1. python地理空间分析指南pdf邓世超_Python地理空间分析指南(第2版)源代码.zip
  2. python if main_Python:if __name__ == '__main__'
  3. 实现贝叶斯分类器_机器学习实战项目-朴素贝叶斯
  4. linux开机自动挂载硬盘指定权限,Linux开机自动挂载硬盘
  5. 如何在注册表里计算机用户名,可以通过注册表修改电脑的密码 ?怎么做的?
  6. 沙洋有几个微服务群_集群 分布式 微服务
  7. python最大值_Python 获取最大值函数|python3教程|python入门|python教程
  8. leetcode142. 环形链表 II(暴力+双链表)
  9. 101. 对称二叉树023(BFS)
  10. oracle计算最大与最小之间数,oracle 分析函数