题意:判断一堆小点有多少个在任意三个大点构成的三角形里面。

思路:其实就是判断点在不在凸包里面,判断的话可以使用二分来判断,就是判断该点在凸包的哪两个点和起点的连线之间。

代码:

 /** @xigua */
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<cstring>
#include<queue>
#include<set>
#include<string>
#include<map>
#include<climits>
#define PI acos(-1)
using namespace std;
typedef long long ll;
typedef double db;
const int maxn = 5e4 + ;
const int mod = ( << ) - ;
const int INF = 1e8 + ;
const ll inf = 1e15 + ;
const db eps = 1e-; struct Node {
ll x, y, id;
} po[maxn];
int n;
int flag; bool cmp(const Node &a, const Node &b) {
if (a.x == b.x) return a.y < b.y;
return a.x < b.x;
} ll mul(ll x1, ll x2, ll y1, ll y2) {
return x1 * y2 - x2 * y1;
}
Node S[maxn];
int top; void ch(Node cur) {
while (top > flag) {
Node po1 = S[top];
Node po2 = S[top-];
ll x1 = po1.x - po2.x, y1 = po1.y - po2.y;
ll x2 = cur.x - po2.x, y2 = cur.y - po2.y;
if (mul(x1, x2, y1, y2) >= ) {
top--;
}
else break;
}
S[++top] = cur;
} int ok(int mid, ll x, ll y) {
ll x1 = S[mid].x - S[].x, y1 = S[mid].y - S[].y;
ll x2 = x - S[].x, y2 = y - S[].y;
ll tmp = mul(x1, x2, y1, y2);
if (tmp > ) return ;
if (tmp == ) return ;
return ;
} void solve() {
while (cin >> n) {
for (int i = ; i <= n; i++) {
scanf("%I64d%I64d", &po[i].x, &po[i].y);
po[i].id = i;
}
sort(po+, po++n, cmp);
top = ;
flag = ;
for (int i = ; i <= n; i++) {
ch(po[i]);
}
flag = top;
for (int i = n-; i >= ; i--) {
ch(po[i]);
}
top--;
int q, ans = ; cin >> q;
Node tmp[maxn];
for (int i = ; i <= top; i++)
tmp[i] = S[i];
for (int i = ; i <= top; i++)
S[i] = tmp[top-i+];
while (q--) {
ll x, y;
scanf("%I64d%I64d", &x, &y);
int l = , r = top; //二分上界和下界
while (l < r) {
int mid = l + r + >> ;
if (ok(mid, x, y)) //在当前这条线之上
l = mid;
else r = mid - ;
}
if (l == top) { //在上界需要特殊判断
if (ok(l, x, y) == ) {
ll a = x - S[].x, b = y - S[].y;
ll dis1 = a * a + b * b;
a = S[l].x - S[].x, b = S[l].y - S[].y;
ll dis2 = a * a + b * b;
if (dis1 <= dis2) ans++;
}
continue;
}
Node xx[];
xx[] = S[], xx[] = S[l], xx[] = S[l+], xx[] = S[];
ll are1 = ;
for (int i = ; i <= ; i++) {
ll x1 = xx[i].x - x, y1 = xx[i].y - y;
ll x2 = xx[i+].x - x, y2 = xx[i+].y - y;
ll tmp = mul(x1, x2, y1, y2);
if (tmp < ) tmp = -tmp;
are1 += tmp;
}
ll x1 = xx[].x - xx[].x, y1 = xx[].y - xx[].y;
ll x2 = xx[].x - xx[].x, y2 = xx[].y - xx[].y;
ll are2 = mul(x1, x2, y1, y2);
//if (are1 < 0) are1 = -are1;
if (are2 < ) are2 = -are2;
if (are2 == are1) ans++; //通过面积来判断,are1代表的是加上该点的
}
cout << ans << endl;
}
} int main() {
//cin.sync_with_stdio(false);
//freopen("in.txt", "r", stdin);
//freopen("isharp.out", "w", stdout);
int t = ; //cin >> t; while (t--) {
solve();
}
return ;
}

Gym 100883J palprime(二分判断点在凸包里)的更多相关文章

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

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

  2. A Round Peg in a Ground Hole(判断是否是凸包,点是否在凸包内,圆与多边形的关系)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4628   Accepted: 1434 Description The D ...

  3. POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置关系

    POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置 Description Calculate the number of toys th ...

  4. UVALive7461 - Separating Pebbles 判断两个凸包相交

    //UVALive7461 - Separating Pebbles 判断两个凸包相交 #include <bits/stdc++.h> using namespace std; #def ...

  5. php判断检测一个数组里有没有重复的值

    php判断检测一个数组里有没有重复的值 php里有一个处理数组重复值得函数array_unique,我们的思路就是用这个函数来实现的. if (count($array) != count(array ...

  6. BZOJ-2756 奇怪的游戏 黑白染色+最大流+当前弧优化+二分判断+分类讨论

    这个题的数据,太卡了,TLE了两晚上,各种调试优化,各种蛋疼. 2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit ...

  7. UVa 10256 (判断两个凸包相离) The Great Divide

    题意: 给出n个红点,m个蓝点.问是否存在一条直线使得红点和蓝点分别分布在直线的两侧,这些点不能再直线上. 分析: 求出两种点的凸包,如果两个凸包相离的话,则存在这样一条直线. 判断凸包相离需要判断这 ...

  8. codeforces 8D Two Friends 二分+ 判断三个圆是否有公共交点

    题目链接 有两个人x, y, 现在在A点, x要直接去B点, y要先去C点在去B点, 现在给出x, y两人可以行走的最大距离T1, T2, 求出他们从A点出发之后, 可以走的最长的公共路径. 我们先看 ...

  9. K - Video Reviews Gym - 101755K (二分)

    题目链接: K - Video Reviews Gym - 101755K 题目大意: 一家公司想让个人给他们的产品评论,所以依次去找这个人,第i个人会评论当且仅当已经有个人评论或他确实对这个产品感兴 ...

随机推荐

  1. C++类静态变量的一种使用特例

    不同进程里的数据默认情况下是互不影响的. 静态变量是属于类本身的,它的所有实例可以共享这个静态变量,但是有个先天条件就是在同一个进程的情况下!!

  2. C#高级参数out,ref,params

    在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? out 当需要返回一系列返回值时可用out高级 ...

  3. Codeforces712C【贪心】

    看了这篇.. http://blog.csdn.net/queuelovestack/article/details/52503162 直接就是从小到大,那么每次按最大的递增顺序上去,就是了. 因为每 ...

  4. Codevs 1140 Jam的计数法

    1140 Jam的计数法 题目描述 Description Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个 ...

  5. Django框架知识2

    1.Http消息格式: 1.请求(request): 请求方法 请求路径 HTTP/1.1\r\n k1:v1\r\n k2:v2\r\n \r\n 请求体正文 2.响应(response) HTTP ...

  6. C 语言实例 - 输出当前文件执行代码

    C 语言实例 - 输出当前文件执行代码 输出当前文件执行代码,__FILE__ 为当前执行的文件常量. 实例 #include <stdio.h> int main() { FILE *f ...

  7. JQuery | trigger() 方法

    trigger() 方法触发被选元素的指定事件类型. 语法格式: trigger(type,[data]) type:触发事件类型 [data]:可选项,表示在触发事件时传递给函数的附加参数. 实例: ...

  8. python操作rabbitmq实现广播效果

    生产方(Fanout_Publisher.py) # __author__ = 'STEVEN' import pika #开启socket connection = pika.BlockingCon ...

  9. keil_rtx特点

    Keil RTX是一个专为ARM及Cortex M系列处理器开发的无版税的确定的实时操作系统.它允许工程师建立多任务同步并行的程序软件,同时也能帮助使程序代码更加结构化和便于维护.   产品亮点 所有 ...

  10. POJ 1458 Common Subsequence DP

    http://poj.org/problem?id=1458 用dp[i][j]表示处理到第1个字符的第i个,第二个字符的第j个时的最长LCS. 1.如果str[i] == sub[j],那么LCS长 ...