【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 ...
随机推荐
- gcc 与 g++的区别
原文: http://www.cnblogs.com/wb118115/p/5969775.html ------------------------------------------------- ...
- Django缓存设置
由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...
- Zabbix告警脚本-微信
1.weixin.sh [root@iot-svndata02 bin]# cat weixin.sh #!/bin/bash ###SCRIPT_NAME:weixin.sh### ###send ...
- Linux安装配置Redis,CentOS7下安装Redis教程
1.下载Redis wget https://download.redis.io/releases/redis-3.0.4.tar.gz 2 . 解压Redis .tar.gz 3 . 编译安装Red ...
- mysql数据库导入与导出
导出 导出数据和表结构: mysqldump -u用户名 -p 数据库名 > 数据库名.sql mysqldump -uroot -p dbname > dbname .sql ...
- 拉普拉斯平滑处理 Laplace Smoothing
背景:为什么要做平滑处理? 零概率问题,就是在计算实例的概率时,如果某个量x,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是0.在文本分类的问题中,当一个词语没有在训练样本中出现,该词 ...
- CentOS 下用 Nginx 和 uwsgi 部署 flask 项目
前几天利用flask 写了几个调用salt-api 的接口,需要上线到正式环境,搜了一下 都是 用 nginx + uwsgi 来部署,这里记录下关键的配置项. 1.首先将代码上传到服务器上目录为: ...
- 虚拟机下 centos7 无法连接网络
[root@localhost ~]# cd /etc/sysconfig/network-scripts [root@localhost network-scripts]# ls ifcfg-ens ...
- Python开发——数据类型【字符串】
字符串定义 字符串是一个有序的字符的集合,用于存储和表示基本的文本信息 在Python中加了引号的字符,都被认为是字符串! 单引号.双引号.多引号之间的区别? 答案:单双引号没有区别 多引号的作用? ...
- python基础之Day15
一.函数递归 什么是函数递归: 函数递归调用是一种特殊的嵌套调用,在调用一个函数的过程中,又直接或间接地调用了该函数本身. 其中,函数的递归有明确的结束条件,不能无限制的调用,否则会撑破内存,在Pyt ...