【xsy2305】喽 计算几何
UPD:这个做法被hack了
题目大意:给你$n$个红点和$m$个黑点,问你至少需要保留多少个黑点,才能用由黑点组成的凸包包住所有红点。
数据范围:$n≤10^5$,$m≤500$
首先,我们将红点和黑点丢到一起,求一个凸包。凸包上的点能用黑点就用黑点,否则才用红点。
所有重点,三点共线的点,都会被删除。
如果求出的凸包上有红点,那么显然是包不住的,直接输出-1即可。
我们将在凸包上的黑点找出。
设$nxt[i]$表示凸包上第$i$号节点,能在顺时针方向上删除多少个凸包上的点,使得凸包依然能包含住全部的红点。
如果我们求出了这个东西,我们显然可以在$O(m)$的时间复杂度内,求出最少需要多少个点。
考虑如何求$nxt[i]$
我们对于由$i$和$i+nxt[i]$构成的连线,如果是合法的,那么显然要满足凸包外侧没有任何点。
我们可以对所有红点,都用叉积判一遍就可以了。
更新$nxt[i]$的过程可以用类似旋转卡壳的方式来搞,单次均摊是$O(n)$的。
(我场上$sb$了居然在求凸包,虽然也可以判,但是它T了)
这么搞时间复杂度是$O(nm)$的,实际上跑得飞快。
时间复杂度为$O((n+m)\log\ (n+m)+nm)$
#include<bits/stdc++.h>
#define L long long
#define M 110000
#define INF 19890604
using namespace std; struct node{
L x,y;int type;
void rd(int Type){type=Type; scanf("%lld%lld",&x,&y);}
node(){x=y=type=;}
node(L X,L Y,int Type){x=X; y=Y; type=Type;}
friend node operator +(node a,node b){return node(a.x+b.x,a.y+b.y,);}
friend node operator -(node a,node b){return node(a.x-b.x,a.y-b.y,);}
friend L operator *(node a,node b){return a.x*b.y-a.y*b.x;}
friend bool operator ==(node a,node b){return a.x==b.x&&a.y==b.y;}
}a[M],s[M],b[],all[M],bas=node(,1e9,);
int n,m,cnt=,nm=; bool cmp(node x,node y){
if(x.x==y.x&&x.y==y.y) return x.type<y.type;
return (x-bas)*(y-bas)>;
}
void build(){
for(int i=;i<=nm;i++) if(all[].y>all[i].y) swap(all[],all[i]);
bas=all[]; sort(all+,all+nm+,cmp);
for(int i=;i<=nm;i++){
while(cnt>&&(s[cnt]-s[cnt-])*(all[i]-s[cnt-])<=)
cnt--;
if(cnt>&&s[cnt]==all[i]) cnt--;
s[++cnt]=all[i];
}
}
int nxt[M]={},vis[M]={};
int dfs(int x,int dep){
if(vis[x]) return printf("%d\n",dep-vis[x]);
vis[x]=dep;
dfs(nxt[x],dep+);
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) a[i].rd(),all[++nm]=a[i];
for(int i=;i<=m;i++) b[i].rd(),all[++nm]=b[i];
build();
for(int i=;i<=cnt;i++) if(s[i].type==) return printf("-1\n");
if(cnt==) return printf("1\n");
memset(b,,sizeof(b)); m=cnt;
for(int i=;i<=m;i++) b[i]=b[i+cnt]=s[i];
for(int i=,j=;i<=m;i++){
while(){
if(j==i) j++;
for(int k=;k<=n;k++)
if((a[k]-b[i])*(b[j]-b[i])>)
goto loop;
j++;
}
loop:;
nxt[i]=(j-+m)%m+;
}
dfs(,);
}
【xsy2305】喽 计算几何的更多相关文章
- ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)
POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...
- HDU 2202 计算几何
最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- ACM 计算几何中的精度问题(转)
http://www.cnblogs.com/acsmile/archive/2011/05/09/2040918.html 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模 ...
- hdu 2393:Higher Math(计算几何,水题)
Higher Math Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)
Rescue The Princess Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Several days ago, a b ...
- [知识点]计算几何I——基础知识与多边形面积
// 此博文为迁移而来,写于2015年4月9日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vxaq.html 1.前言 ...
- POJ 1106 Transmitters(计算几何)
题目链接 切计算几何,感觉计算几何的算法还不熟.此题,枚举线段和圆点的直线,平分一个圆 #include <iostream> #include <cstring> #incl ...
- TYVJ计算几何
今天讲了计算几何,发几道水水的tyvj上的题解... 计算几何好难啊!@Mrs.General....怎么办.... 这几道题都是在省选之前做的,所以前面的Point运算啊,dcmp啊,什么什么的,基 ...
- 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点
平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...
随机推荐
- “AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (下)
在前一部分的最后,我们给出了一个寻路的示例,在大多数情况下,运行还算良好,但是有一个小问题,如下图: 很明显,障碍物已经把路堵死了,但是小球仍然穿过对角线跑了出来! 问题在哪里:我们先回顾一下ASta ...
- Windbg断点调试
[文章主题] Windbg是Windows驱动调试的重要软件,也是必须学习的软件,前面的博客介绍了一些双机调试的环境配置,只要按照我所说的步骤一步步下来就可以完成环境搭建. 本文主要介绍如何调试sys ...
- springboot整合mybatis遇到的那些坑
1.接口类(指*Mapper.java)在spring中注册的问题 当控制台打印如下信息: A component required a bean named '*Mapper' that could ...
- 动画之一:视图动画 View Animation
原文:https://blog.csdn.net/pzm1993/article/details/77167049 view动画支持4中动画效果,分别是: 透明度动画(AlphaAnimation) ...
- oracle优化技巧及实例(总结)
1.关于exists和in in是循环的方式,在内存中处理, exists是执行数据库查询, select tpd.personaccountid,sum(nvl(tpd.CREDIT_SUM, 0) ...
- nodejs+https 使用openssl (window)
HTML的getUsermedia必是要安全的连接 比如 localhost.127.0.0.1 .https chrome才让调用摄像头 1.申请域名.备案.域名解析 2.openssl生成 打开g ...
- ECMAscript,DOM,BOM哪个比较重要
ECMA > DOM > BOM ECMA是JS的核心,语法.变量.对象.各种对象的API.作用域.原型链.闭包.This指向.构造函数等等必须要熟练,有了这些基础你才能去熟练的操作DOM ...
- py2和py3的区别总结
1.编码 python2默认编码方式ASCII码(不能识别中文,要在文件头部加上 #-*- encoding:utf-8 -*- 指定编码方式) python3默认编码方式unicode(可识别中 ...
- 18. pt-pmp
pt-pmp 是一个非常简单的工具,可以用来获取MySQL的堆栈信息.工具首先获取运行过程中的mysqld堆栈信息,然后将相似的线程进行汇总排序,根据调用频繁程度从高到低打印出来. 查看pt-pmp的 ...
- linux下反弹shell
01 前言 CTF中一些命令执行的题目需要反弹shell,于是solo一波. 02 环境 win10 192.168.43.151 监听端 装有nc kali ...