题意:给定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. 【idea】【sonarlint】指定文件夹扫描

    选择文件夹右键->Analyze->Analyze with SonarLint

  2. Instance Variable Hiding in Java

    class Test { // Instance variable or member variable private int value = 10; void method() { // This ...

  3. 【转帖】Flink 核心技术浅析(整理版)

    Flink 核心技术浅析(整理版) https://www.cnblogs.com/swordfall/p/10612404.html 分类: Flink undefined 1. Flink简介 A ...

  4. SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)

     下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式.   首先我们先创建两个数据库表,分别是user用户表和account账户表 ...

  5. 不会前后端,用vps搭建个人博客(二)

    <接上一篇>   四.添加网页内容 1.下载安装WordPress 输入以下命令: wget https://wordpress.org/latest.tar.gz 当然你也可以用浏览器进 ...

  6. BZOJ1060或洛谷1131 [ZJOI2007]时态同步

    BZOJ原题链接 洛谷原题链接 看上去就觉得是一道树形\(\mathtt{DP}\),不过到头来我发现我写了一个贪心.. 显然对越靠近根(记为\(r\))的边进行加权贡献越大,且同步的时间显然是从根到 ...

  7. Unity - 简单实现音频管理系统

    简单实现Unity音频管理脚本,便于长短音频的播放控制和音量控制等,核心方法为对象池的应用. 项目地址:AudioPlay - SouthBegonia 包含方法: 持有所有 AudioSource ...

  8. 论文笔记 : NCF( Neural Collaborative Filtering)

    ABSTRACT 主要点为用MLP来替换传统CF算法中的内积操作来表示用户和物品之间的交互关系. INTRODUCTION NeuCF设计了一个基于神经网络结构的CF模型.文章使用的数据为隐式数据,想 ...

  9. Java 中文转换拼音工具

    Java 中文转换拼音工具 /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p&g ...

  10. java之hibernate之加载策略和抓取策略

    1.加载策略:指hibernate查询数据时,采用什么样的方式将数据写入内存.Hibernate中提供了两种方式来加载数据:懒加载和即时加载. 2.懒加载又称延迟加载,指使用hiberante API ...