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

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

代码:

 /** @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. TypeScript完全解读(26课时)_8.ES6精讲-ES6中的类(进阶)

    8.TypeScript完全解读-ES6精讲-类(进阶) 在index.ts内引入 Food创建的实例赋值给Vegetabled这个原型对象,这样使用Vegetables创建实例的时候,就能继承到Fo ...

  2. TypeScript完全解读(26课时)_18.Mixins混入

    本节的代码在mixin.ts文件内 同时在index.ts内引入 混入就是把两个对象或者类的内容混合到一起,从而实现一些功能复用. 对象混入 js中对象的混入 先来看一个js中对象的混入的例子 首先定 ...

  3. python 三元表达式 列表推导式,生成器表达式。递归,匿名函数, 内置函数

    三元表达式 三元表达式仅应用于: 1.条件成立返回一个值 2.条件不成立返回一个值 res = x if x>y else y print(res) name= input("姓名&g ...

  4. Ubuntu16.04 安装Python3.6 报错

    问题: 在安装Python 3.6,执行make install 时出现以下错误: zipimport.ZipImportError: can't decompress data; zlib not ...

  5. JSON 下 -- jansson 示例

    JSON 下 —— jansson 示例 参考网址: jansson 库的下载: http://www.digip.org/jansson/ 安装jansson 步骤: http://blog.csd ...

  6. js 点击往div里添加图片(实例)

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  7. 聪明的质监员(codevs 1138)

    题目描述 Description 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n 个矿石,从1到n 逐一编号,每个矿石都有自己的重量wi 以及价值vi.检验矿产的流程是:见图   ...

  8. [Xcode 实际操作]一、博主领进门-(8)应用代理文件(AppDelegate.swift)详解

    目录:[Swift]Xcode实际操作 本文将演示使用iOS模拟器,演示程序的生命周期. 在项目导航区,打开应用代理文件[AppDelegate.swift] 应用代理文件时系统运行本应用的委托,里面 ...

  9. CSS优先级、CSS选择器、编写CSS时的注意事项

    CSS的优先级: 内嵌样式>ID选择器>类选择器>标签选择器 内部样式>内部样式>外部样式 CSS的选择器: 选择器:在 CSS 中,选择器是一种模式,用于选择需要添加样 ...

  10. laravel之null替换空字符串中间件

    在laravel写接口的时候免不了数据库中保存null,可用诸如设置ORM的访问器或以下方法处理 $goods->name?$goods->name:''; 其实可以利用路由中间件,在需要 ...