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】喽 计算几何的更多相关文章

  1. ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)

    POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...

  2. HDU 2202 计算几何

    最大三角形 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. ACM 计算几何中的精度问题(转)

    http://www.cnblogs.com/acsmile/archive/2011/05/09/2040918.html 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模 ...

  4. hdu 2393:Higher Math(计算几何,水题)

    Higher Math Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)

    Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Several days ago, a b ...

  6. [知识点]计算几何I——基础知识与多边形面积

    // 此博文为迁移而来,写于2015年4月9日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vxaq.html 1.前言 ...

  7. POJ 1106 Transmitters(计算几何)

    题目链接 切计算几何,感觉计算几何的算法还不熟.此题,枚举线段和圆点的直线,平分一个圆 #include <iostream> #include <cstring> #incl ...

  8. TYVJ计算几何

    今天讲了计算几何,发几道水水的tyvj上的题解... 计算几何好难啊!@Mrs.General....怎么办.... 这几道题都是在省选之前做的,所以前面的Point运算啊,dcmp啊,什么什么的,基 ...

  9. 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点

    平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...

随机推荐

  1. elasticsearch5安装

    环境: centos7 es 5.4.3 es安装 一.下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsear ...

  2. 【Django】HTTP status code must be an integer.

    刚刚出现这个问题,还以为是表单提交或者什么网络错误 结果发现是自己的低级错误写了 HttpResponse(request,'sigin_result2.html',context)这个根本不能渲染模 ...

  3. Flask最强攻略 - 跟DragonFire学Flask - 第三篇 Flask 中的 request 之 先知道有这么个东西

    每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...

  4. m_sequencer、p_sequencer

    https://blog.csdn.net/zhajio/article/details/79608323 p - parent sequencer - 要处理的实际sequencer类型的句柄,这个 ...

  5. 使用requests抓取https报SSL错误

    安装requests的方法:sudo pip install requests 当碰到requests链接https的时候报SSL错误的时候使用如下解决: 1:将python的pip 版本升级到9.0 ...

  6. git-如何不写注释能自动带上修改文件信息

    背景:每次提交git,都要写注释,有些情况注释不太好写,或者根本没有必要写,这时可以通过自动加注释方法,比如可以追加修改了哪些文件 解决:通过shell脚本,在脚本里面写git命令,add commi ...

  7. node.js中express的Router路由的使用

    express中的Router作用就是为了方便我们更好的根据路由去分模块.避免将所有路由都写在入口文件中. 一.简单的使用Router const express = require('express ...

  8. CentOS Linux下VNC Server远程桌面配置详解

    http://www.ha97.com/4634.html PS:偶以前基本不用Linux的远程图形桌面,前几天有开发的同事配置CentOS的vnc有问题,找我解决,就顺便记录总结一下,这个总结是比较 ...

  9. mybatis电子商务平台b2b2c

    技术解决方案 开发语言: java.j2ee 数据库:mysql JDK支持版本: JDK1.6.JDK1.7.JDK1.8版本 核心技术:分布式.云服务.微服务.服务编排等. 核心架构: 使用Spr ...

  10. Object.defineProperty之observe实现

    对数据对象的属性批量劫持设置: <script type="text/javascript"> function observe(data){ if(!data || ...