题意:给定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(凸包+二分 ,判定多个点在凸包内)的更多相关文章

  1. UVA - 13024 Saint John Festival 凸包+二分

    题目链接:https://vjudge.net/problem/UVA-13024 题意:先给出\(L\)个点构造一个凸包,再给出\(S\)个点,询问有几个点在凸包内. 题解:判断点是否在凸包内的模板 ...

  2. Saint John Festival Gym - 101128J (凸包二分)

    Problem J: Saint John Festival \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 给出\(n\)个大点,和\(m\ ...

  3. UVALive 7281 Saint John Festival (凸包+O(logn)判断点在凸多边形内)

    Saint John Festival 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/J Description Porto's ...

  4. 【计算几何】【凸包】【极角排序】【二分】Gym - 101128J - Saint John Festival

    平面上n个红点,m个黑点,问你多少个黑点至少在一个红三角形内. 对红点求凸包后,转化为询问有多少个黑点在凸包内. 点在凸多边形内部判定,选定一个凸包上的点作原点,对凸包三角剖分,将其他的点极角排序之后 ...

  5. Gym 101128J Saint John Festival(凸包 + 二分判点和凸包关系)题解

    题意:给你一堆黑点一堆红点,问你有最多几个黑点能找到三个红点,使这个黑点在三角形内? 思路:显然红点组成的凸包内的所有黑点都能做到.但是判断黑点和凸包的关系朴素方法使O(n^2),显然超时.那么我现在 ...

  6. 15-16 ICPC europe J Saint John Festival (graham扫描法+旋转卡壳)

    题意:给n个大点,m个小点$(n<=1e5,m<=5e5),问有多少个小点,存在3个大点,使小点在三个大点组成的三角形内. 解题思路: 首先,易证,若该小点在某三大点行成的三角形内,则该小 ...

  7. 【bzoj3203】[Sdoi2013]保护出题人 凸包+二分

    题目描述 输入 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai 点的 ...

  8. 【bzoj2402】陶陶的难题II 分数规划+树链剖分+线段树+STL-vector+凸包+二分

    题目描述 输入 第一行包含一个正整数N,表示树中结点的个数.第二行包含N个正实数,第i个数表示xi (1<=xi<=10^5).第三行包含N个正实数,第i个数表示yi (1<=yi& ...

  9. 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)

    layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catal ...

随机推荐

  1. 绘制UML图的工具

    目前在用processOn网站进行绘制:https://www.processon.com/ 学习其简单的入门教程: https://www.processon.com/support https:/ ...

  2. [转帖]Docker公司被收购,开源界尴尬不?

    Docker公司被收购,开源界尴尬不? https://news.51cto.com/art/201911/606189.htm Docker公司被谁收了? Docker公司被谁收了?Mirantis ...

  3. C++中几种字符串表示方法

    最近学习C++时,被几种字符串搞的有点乱,这里记录一下. c++中有两种风格字符串,分别是: C++风格字符串 C风格字符串 它们各自的声明方式如下: void main(){ string a = ...

  4. 如何修改通过Anaconda安装的jupyter notebook的工作目录

    通过Anaconda安装jupyter notebook,对新手来说是一个非常明智的选择,可以避免很多不必要的麻烦! jupyter notbook默认情况下的工作目录是c:\user\...,接下来 ...

  5. Django框架(十二)-- 中间件、CSRF跨站请求伪造

    中间件 一.什么是中间件 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models) 响应的时候也需要经过中间件才能到达web服务网关接口 djang ...

  6. C语言:求π

    1835: 圆的面积 本题的关键在于如何求π: 今天先给给大家介绍一种针对本题的方法——利用反三角函数求π. 在高数中arcsin(0)=arccos(1)=π,不过编译器中并没有arcsin和arc ...

  7. Linux新装系统简单指南

    也许更好的阅读体验 换源 1. 备份原来的源 sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 2.更换源 先用\(gedit\)打开文 ...

  8. 将 C++/WinRT 中的线程切换体验带到 C# 中来(WPF 版本)

    原文:将 C++/WinRT 中的线程切换体验带到 C# 中来(WPF 版本) 如果你要在 WPF 程序中使用线程池完成一个特殊的任务,那么使用 .NET 的 API Task.Run 并传入一个 L ...

  9. 2019 新华网java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.新华网等公司offer,岗位是Java后端开发,最终选择去了新华网. 面试了很多家公司,感觉大部分公司考察的点都差 ...

  10. 【开发笔记】- 在MySQL中 root账户被锁定怎么办

    MySQL的账户被锁定怎么办? 用Navicat连接数据库报错如下: Access denied for user 'root'@'localhost' (using password:YES) 原因 ...