平面上n个红点,m个黑点,问你多少个黑点至少在一个红三角形内。

对红点求凸包后,转化为询问有多少个黑点在凸包内。

点在凸多边形内部判定,选定一个凸包上的点作原点,对凸包三角剖分,将其他的点极角排序之后,使用二分法就可以判定点在哪个剖分出来的三角形的夹角内,然后用叉积即可判定其在凸包内还是外,O(logn):

http://www.cnblogs.com/dream-wind/archive/2012/05/23/2514694.html

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
int n,m,K,O;
struct Point{
ll x,y;
double jiao;
Point(){}
Point(const ll &x,const ll &y){
this->x=x;
this->y=y;
}
void Read(){
scanf("%lld%lld",&x,&y);
}
};
typedef Point Vector;
Point p0,p;
Vector operator - (const Point &a,const Point &b){
return Vector(a.x-b.x,a.y-b.y);
}
ll Cross(const Vector &a,const Vector &b){
return a.x*b.y-a.y*b.x;
}
bool cmp(const Point &a,const Point &b){
return a.x!=b.x ? a.x<b.x : a.y<b.y;
}
bool cm2(const Point &a,const Point &b){
return a.jiao<b.jiao;
}
Point ps[10010],qs[10010];
bool check(int mid){
return Cross(qs[mid]-p0,p-p0)<=0;
}
int main(){
// freopen("j.in","r",stdin);
scanf("%d",&n);
for(int i=0;i<n;++i){
ps[i].Read();
}
sort(ps,ps+n,cmp);
for(int i=0;i<n;++i){
while(K>1 && Cross(qs[K-1]-qs[K-2],ps[i]-qs[K-1])<=0){
--K;
}
qs[K++]=ps[i];
}
for(int i=n-2,t=K;i>=0;--i){
while(K>t && Cross(qs[K-1]-qs[K-2],ps[i]-qs[K-1])<=0){
--K;
}
qs[K++]=ps[i];
}
--K;
for(int i=1;i<K;++i){
if(qs[i].y<qs[O].y || (qs[i].y==qs[O].y && qs[i].x<qs[O].x)){
O=i;
}
}
p0=qs[O];
for(int i=0;i<K;++i){
qs[i].jiao=atan2((double)(qs[i].y-qs[O].y),(double)(qs[i].x-qs[O].x));
}
for(int i=O;i<K-1;++i){
qs[i]=qs[i+1];
}
--K;
sort(qs,qs+K,cm2);
scanf("%d",&m);
int ans=0;
for(int i=1;i<=m;++i){
p.Read();
if(Cross(p-p0,qs[0]-p0)<=0 && Cross(p-p0,qs[K-1]-p0)>=0){
int l=1,r=K-1;
while(l<r){
int mid=(l+r>>1);
if(check(mid)){
r=mid;
}
else{
l=mid+1;
}
}
if(Cross(p-qs[l-1],qs[l]-qs[l-1])<=0){
++ans;
}
}
}
printf("%d\n",ans);
return 0;
}

【计算几何】【凸包】【极角排序】【二分】Gym - 101128J - Saint John Festival的更多相关文章

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

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

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

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

  3. hrbustoj 1305:多边形(计算几何,极角排序练习)

    多边形 Time Limit: 1000 MS     Memory Limit: 65536 K Total Submit: 113(42 users)   Total Accepted: 51(3 ...

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

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

  5. Gym 101986D Making Perimeter of the Convex Hull Shortest(凸包+极角排序)

    首先肯定是构造一个完整的凸包包括所有的点,那么要使得刚好有两个点在外面,满足这个条件的只有三种情况. 1.两个在凸包上但是不连续的两个点. 2.两个在凸包上但是连续的两个点. 3.一个在凸包上,还有一 ...

  6. [置顶] Codeforces 70D 动态凸包 (极角排序 or 水平序)

    题目链接:http://codeforces.com/problemset/problem/70/D 本题关键:在log(n)的复杂度内判断点在凸包 或 把点插入凸包 判断:平衡树log(n)内选出点 ...

  7. POJ 2007 Scrambled Polygon [凸包 极角排序]

    Scrambled Polygon Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8636   Accepted: 4105 ...

  8. [CF1019D]Large Triangle[极角排序+二分]

    题意 给出平面上 \(n\) 个点 \((x_i, y_i)\),问是否存在三个点构成的三角形的面积恰好为 \(S\) ,有的话,输出任意一组解即可. \(n\leq 2000\) 分析 BZOJ37 ...

  9. bzoj 2087: [Poi2010]Sheep【凸包+极角排序+dp】

    首先处理处理出来哪些边能连--能把羊分成两个偶数部分的,实现是在凸包上枚举极点,极角排序,枚举凸包上点对判断两边羊的个数的奇偶即可,设可以连边为v[i][j]=1 然后设f[i][j]为从i到j个凸包 ...

随机推荐

  1. hdu 1253 胜利大逃亡(简单题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 题目大意:在所给的时间能顺利离开城堡. #include <iostream> #i ...

  2. spring-retry 重试机制

    业务场景 应用中需要实现一个功能: 需要将数据上传到远程存储服务,同时在返回处理成功情况下做其他操作.这个功能不复杂,分为两个步骤:第一步调用远程的Rest服务逻辑包装给处理方法返回处理结果:第二步拿 ...

  3. 【Sqlite3】sqlite_sequence表(转)

    sqlite_sequence表也是SQLite的系统表.该表用来保存其他表的RowID的最大值.数据库被创建时,sqlite_sequence表会被自动创建.该表包括两列.第一列为name,用来存储 ...

  4. 一个朋友 js图表开发问题 用 c和 js 解决

    引言            不求知道一切, 只求发现一件 -- 乔治·西蒙·欧姆 附注:那些存在于梦幻中的事迹,那些儿时梦中的人物,每每看起,都觉得 .哎 .... 岁月 ... 一直在努力 ...  ...

  5. 如何让Footer无论页面长短都在最底部, 并和正文保持固定高度?

    html结构: <div id="container"> <div id="content">页面正文</div> < ...

  6. web请求响应

    转载自:SanMaoSpace 1.Web开发的定义首先看看微软对Web开发的定义:Web开发是一个指代网页或网站编写过程的广义术语.网页使用 HTML.CSS 和 JavaScript编写.这些页面 ...

  7. LeetCode214. Shortest Palindrome

    Given a string s, you are allowed to convert it to a palindrome by adding characters in front of it. ...

  8. 《The art of software testing》的一个例子

    这几天一直在看一本书,<The art of software testing>,里面有一个例子挺有感触地,写出来和大家分享一下: [问题] 从输入对话框中读取三个整数值,这三个整数值代表 ...

  9. 【JBPM4】任务form表单

    主要是在任务节点处保存一个链接地址(表单),方便在执行到此时取值,访问. 好处是XML可随时修改,部署. JPDL <?xml version="1.0" encoding= ...

  10. CrudRepository.findOne报错

    踩坑,写controller,用到了Repository.findOne(id);一直报错,发现CrudRepository没有方法. 排查原因是JAR包的原因. 我之前是2.0.1 springbo ...