15-16 ICPC europe J Saint John Festival (graham扫描法+旋转卡壳)
题意:给n个大点,m个小点$(n<=1e5,m<=5e5),问有多少个小点,存在3个大点,使小点在三个大点组成的三角形内。
解题思路:
首先,易证,若该小点在某三大点行成的三角形内,则该小点必然处在大点组成的凸包内。那么首先,现将大点形成的凸包计算出来,但是若对每个点进行暴力枚举,在最坏情况下,若凸包上点数太多并且脸黑不断找区间,复杂度会达到$O(nm)$,因此要对点是否在凸包内的判断过程进行优化。
将凸包划分为若干个三角形,我们可以先将这m个待判断的点进行极角排序,排序后,极角较大的点要么处在较小的点的逆时针方向的三角形内要么在同一个三角形内,要么两个点在同一三角形内。因此在点坐标转移时,采用旋转卡壳,所在的三角形区域也逆时针选择即可。而对于小点是否在三角形内,采用面积判断即可,为了防止爆精度推荐用行列式计算面积,时间复杂度$O(nlogn+mlogm+m)$
下面贴上AC代码。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pii;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rept(i,a,b) for(int i=a;i<=b;i++)
#define mes(a,b) memset(a,b,sizeof a)
#define pb push_back
#define dd(x) cout<<#x<<"="<<x<<" "
#define de(x) cout<<#x<<"="<<x<<"\n"
#define fi first
#define se second
#define mp make_pair
pii point[],small[];
pii operator -(const pii &s1,const pii &s2)
{
return mp(s1.fi-s2.fi,s1.se-s2.se);
}
int s[];
ll chaji(const pii &s1,const pii &s2)
{
return s1.fi*s2.se-s1.se*s2.fi;
}
bool comp(const pii &s1,const pii &s2)
{
if((s1.se<point[].se)+(s2.se<point[].se)==) return s1.se>s2.se;
ll x=chaji(s1-point[],s2-point[]);
if(x>||(x==&&abs(s1.fi-point[].fi)<abs(s2.fi-point[].fi))) return ;
else return ;
}
ll sqare(const pii &a,const pii &b,const pii &c)
{
return abs( (b.fi-a.fi)*(c.se-a.se) -(c.fi-a.fi)*(b.se-a.se) );
} int main()
{
ios::sync_with_stdio(false);
cin.tie();
int n,m;
cin>>n;
rep(i,,n) cin>>point[i].fi>>point[i].se;
int p=;
rep(i,,n)
if( point[i].se<point[p].se||(point[i].se==point[p].se&&point[i].fi<point[p].fi) )
p=i;
swap(point[],point[p]);
//dd(point[0].fi);de(point[0].se);
sort(point+,point+n,comp);
int cnt=;
s[cnt++]=;
s[cnt++]=; rep(i,,n)
{
while(cnt>=&&chaji(point[s[cnt-]]-point[i],point[s[cnt-]]-point[i])>=) cnt--;
s[cnt++]=i;
} cin>>m;
rep(i,,m) cin>>small[i].fi>>small[i].se;
sort(small,small+m,comp);
int ans=;
p=; int start=;
while(start<m&&chaji(small[start]-point[s[]],point[s[]]-point[s[]])>) start++;
rep(i,start,m)
{
if(small[i].se<point[].se) break;
while(p<cnt-&&chaji( small[i]-point[s[]],point[s[p+]]-point[s[]] )< ) p++;
if(p==cnt-) break;
if(chaji( small[i]-point[s[]],point[s[p]]-point[s[]] )== )
{
if((small[i].fi<point[s[]].fi)+(small[i].fi<point[s[p]].fi)==) ans++;
continue;
}
else if(chaji( small[i]-point[s[]],point[s[p+]]-point[s[]] )<)
{
if((small[i].fi<point[s[]].fi)+(small[i].fi<point[s[p+]].fi)==) ans++;
continue;
}
if(sqare(point[s[]],point[s[p]],point[s[p+]])==sqare(point[s[]],point[s[p]],small[i])+sqare(point[s[]],point[s[p+]],small[i])+sqare(point[s[p]],point[s[p+]],small[i]))
ans++;
}
cout<<ans<<endl;
return ;
}
15-16 ICPC europe J Saint John Festival (graham扫描法+旋转卡壳)的更多相关文章
- Saint John Festival Gym - 101128J (凸包二分)
		
Problem J: Saint John Festival \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 给出\(n\)个大点,和\(m\ ...
 - UVALive 7281	Saint John Festival (凸包+O(logn)判断点在凸多边形内)
		
Saint John Festival 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/J Description Porto's ...
 - 【计算几何】【凸包】【极角排序】【二分】Gym - 101128J - Saint John Festival
		
平面上n个红点,m个黑点,问你多少个黑点至少在一个红三角形内. 对红点求凸包后,转化为询问有多少个黑点在凸包内. 点在凸多边形内部判定,选定一个凸包上的点作原点,对凸包三角剖分,将其他的点极角排序之后 ...
 - UVA - 13024 Saint John Festival 凸包+二分
		
题目链接:https://vjudge.net/problem/UVA-13024 题意:先给出\(L\)个点构造一个凸包,再给出\(S\)个点,询问有几个点在凸包内. 题解:判断点是否在凸包内的模板 ...
 - UVA 13024: Saint John Festival(凸包+二分 ,判定多个点在凸包内)
		
题意:给定N个点,Q次询问,问当前点知否在N个点组成的凸包内. 思路:由于是凸包,我们可以利用二分求解. 二分思路1:求得上凸包和下凸包,那么两次二分,如果点在对应上凸包的下面,对应下凸包的上面,那么 ...
 - Gym 101128J Saint John Festival(凸包 + 二分判点和凸包关系)题解
		
题意:给你一堆黑点一堆红点,问你有最多几个黑点能找到三个红点,使这个黑点在三角形内? 思路:显然红点组成的凸包内的所有黑点都能做到.但是判断黑点和凸包的关系朴素方法使O(n^2),显然超时.那么我现在 ...
 - Python Cookbook(第3版)中文版:15.16 不确定编码格式的C字符串
		
15.16 不确定编码格式的C字符串¶ 问题¶ 你要在C和Python直接来回转换字符串,但是C中的编码格式并不确定. 例如,可能C中的数据期望是UTF-8,但是并没有强制它必须是. 你想编写代码来以 ...
 - 剑指offer19:按照从外向里以顺时针的顺序依次打印出每一个数字,4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
		
1 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印 ...
 - linux 学习15 16 启动管理,备份和恢复
		
第十五讲 启动管理 . CentOS .x 启动管理 //此处指6.3 系统运行级别 .运行级别 运行级别 含 义 关机 单用户模式,可以想象为windows的安全模式,主要用于系统修复 //linu ...
 
随机推荐
- LDA算法 (主题模型算法) 学习笔记
			
转载请注明出处: http://www.cnblogs.com/gufeiyang 随着互联网的发展,文本分析越来越受到重视.由于文本格式的复杂性,人们往往很难直接利用文本进行分析.因此一些将文本数值 ...
 - mac编译Cpython
			
源代码中有什么? CPython 源代码分发包含各种工具,库和组件.我们将在本文中探讨这些内容. 首先,我们将重点关注编译器.先从 git 上下载 Cpython 源代码. git clone htt ...
 - fmex挂单挖矿
			
最近fmex上线挂单挖矿,针对挂单写了个程序,"跟随盘口,避免成交",0成本薅羊毛. 代码在 https://github.com/xiaoxiaoleo/fmexminer 使用 ...
 - cross socket tcp客户端开发
			
cross socket tcp客户端开发 uses Net.SocketAPI, Net.CrossSocket.Base, Net.CrossSocket FCrossTcp: ICrossSoc ...
 - https://suchprogramming.com/epoll-in-3-easy-steps/
			
https://suchprogramming.com/epoll-in-3-easy-steps/ https://www.quora.com/What-are-the-key-difference ...
 - Prometheus磁盘监控
			
根据挂载目录 (node_filesystem_size_bytes {mountpoint ="/"} - node_filesystem_free_bytes {mountpo ...
 - Java 13 特性解读
			
Java 13 特性解读 转 https://blog.csdn.net/bjweimengshu/article/details/100978383 2017年8月,JCP执行委员会提出将 ...
 - Android平台签名证书(.keystore)生成指南
			
来源:https://ask.dcloud.net.cn/article/35777 Android平台签名证书(.keystore)生成指南 分类:HTML5+ Android证书 Android平 ...
 - 深入学习c++--智能指针(三) unique_ptr
			
1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 拥有共享对象所有权语义的智能指针 3. unique_ptr: 拥有独有对象所有权语义的智 ...
 - Qt编写自定义控件68-IP地址输入框
			
一.前言 这个IP地址输入框控件,估计写烂了,网上随便一搜索,保证一大堆,估计也是因为这个控件太容易了,非常适合新手练手,一般的思路都是用4个qlineedit控件拼起来,然后每个输入框设置正则表达式 ...