UVA 13024: Saint John Festival(凸包+二分 ,判定多个点在凸包内)
题意:给定N个点,Q次询问,问当前点知否在N个点组成的凸包内。
思路:由于是凸包,我们可以利用二分求解。
二分思路1:求得上凸包和下凸包,那么两次二分,如果点在对应上凸包的下面,对应下凸包的上面,那么在凸包内。
二分思路2:求得凸包(N),划分为N-2个三角形,二分求得对应位置,验证是否在三角形内。
(如果不是凸包,则不能这样做。
三角形代码:
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
struct point{
ll x,y;
point(){}
point(ll xx,ll yy):x(xx),y(yy){}
};
ll dot(point w,point v){ return w.x*v.x+w.y*v.y;}
ll det(point w,point v){ return w.x*v.y-w.y*v.x;}
point operator -(point w,point v){ return point(w.x-v.x,w.y-v.y);}
point a[maxn],ch[maxn]; int ttop,top,N,Q,ans;
bool cmp(point w,point v){
if(w.x!=v.x) return w.x<v.x; return w.y<v.y;
}void convex()
{
top=;
sort(a+,a+N+,cmp);
rep(i,,N) {
while(top>&&det(ch[top]-ch[top-],a[i]-ch[top-])<=) top--;
ch[++top]=a[i];
}
ttop=top;
for(int i=N-;i>=;i--){
while(top>ttop&&det(ch[top]-ch[top-],a[i]-ch[top-])<=) top--;
ch[++top]=a[i];
}
}
bool check(point A)
{
int L=,R=top-,Mid;
while(L<=R){
Mid=(L+R)>>;
if(det(ch[Mid]-ch[],A-ch[])<) R=Mid-;
else {
if(det(ch[Mid+]-ch[],A-ch[])<=&&det(ch[Mid+]-ch[Mid],A-ch[Mid])>=)
return true;
L=Mid+;
}
}
return false;
}
int main()
{
while(~scanf("%d",&N)&&N){
rep(i,,N) scanf("%lld %lld",&a[i].x,&a[i].y);
convex(); ans=;
scanf("%d",&Q);
rep(i,,Q) {
point fcy;
scanf("%lld %lld",&fcy.x,&fcy.y);
if(check(fcy)) ans++;
}
printf("%d\n",ans);
}
return ;
}
上下凸包代码:不知道咋的,一直wa1,也有可能是思路有问题吧,日后再补。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
struct point{
ll x,y;
point(){}
point(ll xx,ll yy):x(xx),y(yy){}
};
ll dot(point w,point v){ return w.x*v.x+w.y*v.y;}
ll det(point w,point v){ return w.x*v.y-w.y*v.x;}
point operator -(point w,point v){ return point(w.x-v.x,w.y-v.y);}
point a[maxn],ch[maxn]; int ttop,top,N,Q,ans;
bool cmp(point w,point v){
if(w.x!=v.x) return w.x<v.x; return w.y<v.y;
}
void convex()
{
top=;
sort(a+,a+N+,cmp);
rep(i,,N) {
while(top>&&det(ch[top]-ch[top-],a[i]-ch[top-])<=) top--;
ch[++top]=a[i];
}
ttop=top;
for(int i=N-;i>=;i--){
while(top>ttop&&det(ch[top]-ch[top-],a[i]-ch[top-])<=) top--;
ch[++top]=a[i];
}
}
bool check1(point A)
{
int L=,R=ttop-,Mid;
while(L<=R){
Mid=(L+R)>>;
if(A.x<ch[Mid].x) R=Mid-;
else {
if(ch[Mid+].x>=A.x&&det(ch[Mid+]-ch[Mid],A-ch[Mid])>=){
return true;
}
L=Mid+;
}
}
return false;
}
bool check2(point A)
{
int L=ttop,R=top-,Mid;
while(L<=R){
Mid=(L+R)>>;
if(A.x>ch[Mid].x) R=Mid-;
else {
if(ch[Mid+].x<=A.x&&det(ch[Mid+]-ch[Mid],A-ch[Mid])>=) return true;
L=Mid+;
}
}
return false;
}
int main()
{
while(~scanf("%d",&N)&&N){
rep(i,,N) scanf("%lld %lld",&a[i].x,&a[i].y);
convex(); ans=;
scanf("%d",&Q);
rep(i,,Q) {
point fcy;
scanf("%lld %lld",&fcy.x,&fcy.y);
if(check1(fcy)&&check2(fcy)) ans++;
}
printf("%d\n",ans);
}
return ;
}
UVA 13024: Saint John Festival(凸包+二分 ,判定多个点在凸包内)的更多相关文章
- UVA - 13024 Saint John Festival 凸包+二分
题目链接:https://vjudge.net/problem/UVA-13024 题意:先给出\(L\)个点构造一个凸包,再给出\(S\)个点,询问有几个点在凸包内. 题解:判断点是否在凸包内的模板 ...
- 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个黑点,问你多少个黑点至少在一个红三角形内. 对红点求凸包后,转化为询问有多少个黑点在凸包内. 点在凸多边形内部判定,选定一个凸包上的点作原点,对凸包三角剖分,将其他的点极角排序之后 ...
- Gym 101128J Saint John Festival(凸包 + 二分判点和凸包关系)题解
题意:给你一堆黑点一堆红点,问你有最多几个黑点能找到三个红点,使这个黑点在三角形内? 思路:显然红点组成的凸包内的所有黑点都能做到.但是判断黑点和凸包的关系朴素方法使O(n^2),显然超时.那么我现在 ...
- 15-16 ICPC europe J Saint John Festival (graham扫描法+旋转卡壳)
题意:给n个大点,m个小点$(n<=1e5,m<=5e5),问有多少个小点,存在3个大点,使小点在三个大点组成的三角形内. 解题思路: 首先,易证,若该小点在某三大点行成的三角形内,则该小 ...
- 【bzoj3203】[Sdoi2013]保护出题人 凸包+二分
题目描述 输入 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai 点的 ...
- 【bzoj2402】陶陶的难题II 分数规划+树链剖分+线段树+STL-vector+凸包+二分
题目描述 输入 第一行包含一个正整数N,表示树中结点的个数.第二行包含N个正实数,第i个数表示xi (1<=xi<=10^5).第三行包含N个正实数,第i个数表示yi (1<=yi& ...
- 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)
layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catal ...
随机推荐
- CentOS7 初始化硬盘分区、挂载、重启自动挂载
挂载硬盘设备到本地有一下步骤: 1.通过fdisk -l命令,查看硬盘信息 可以看到有两块磁盘/dev/vda和/dev/vdb vda是系统盘,vdb使我们新增的数据盘,在上图中其实已经挂载完成(设 ...
- Mybaties的简单使用(全当做复习了)
在使用mybaties的时候,最容易忘掉的是他的动态SQL,不过网上有关这方面的文章很多. 在动态SQl中最常见的几种SQL的语法就是: if choose (when, otherwise) tri ...
- 移动端自适应rem的设置
一般所熟知的css样式大小单位有px,em. px:精确地描述元素大小,不随屏幕大小的变化而变化: em:相对于父元素的大小,如果有层层嵌套的话会导致这个值非常大或者非常小. 在写移动端页面的时候为了 ...
- 超级简单POI导出Excel实战
在一般的生产管理系统都会将数据通过页面导出到Excel,这里以Java为例通过第三方开源poi进行对Excel的操作,具体操作如下 1.引入jar包依赖 这里我以maven的方式引入jar包,具体依赖 ...
- Haystack搜索框架
1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch,Whoosh ...
- 不会前后端,用vps搭建个人博客(二)
<接上一篇> 四.添加网页内容 1.下载安装WordPress 输入以下命令: wget https://wordpress.org/latest.tar.gz 当然你也可以用浏览器进 ...
- navicat连接mysql出现2059
1.找到mysql的目录:C:\Program Files\MySQL\MySQL Server 8.0\bin 2.清空此目录,输入cmd,回车 3.在控制台输入:mysql -u root -p ...
- 在ASP.NET MVC中加载部分视图的方法及差别
在视图里有多种方法可以加载部分视图,包括Partial() .Action().RenderPartial().RenderAction().RenderPage()方法.下面说明一下这些方法的差别. ...
- sqlserver还原差异备份
因为之前遇到还原差异备份,最开始遇到SQLServer报错:"无法还原日志备份或差异备份,因为没有文件可用于前滚".查阅很多资料后,终于得到解决.收集整理成这篇随笔. 问题原因:出 ...
- 变量.argsort()的用法
a=[1,2,5,9,7,3]a=np.array(a)order = a.argsort() # 从小到大排序,并返回索引值print('order=',order)order1= a.argsor ...