Gym 100883J palprime(二分判断点在凸包里)
题意:判断一堆小点有多少个在任意三个大点构成的三角形里面。
思路:其实就是判断点在不在凸包里面,判断的话可以使用二分来判断,就是判断该点在凸包的哪两个点和起点的连线之间。
代码:
/** @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(二分判断点在凸包里)的更多相关文章
- Gym 101128J Saint John Festival(凸包 + 二分判点和凸包关系)题解
题意:给你一堆黑点一堆红点,问你有最多几个黑点能找到三个红点,使这个黑点在三角形内? 思路:显然红点组成的凸包内的所有黑点都能做到.但是判断黑点和凸包的关系朴素方法使O(n^2),显然超时.那么我现在 ...
- A Round Peg in a Ground Hole(判断是否是凸包,点是否在凸包内,圆与多边形的关系)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4628 Accepted: 1434 Description The D ...
- POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置关系
POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置 Description Calculate the number of toys th ...
- UVALive7461 - Separating Pebbles 判断两个凸包相交
//UVALive7461 - Separating Pebbles 判断两个凸包相交 #include <bits/stdc++.h> using namespace std; #def ...
- php判断检测一个数组里有没有重复的值
php判断检测一个数组里有没有重复的值 php里有一个处理数组重复值得函数array_unique,我们的思路就是用这个函数来实现的. if (count($array) != count(array ...
- BZOJ-2756 奇怪的游戏 黑白染色+最大流+当前弧优化+二分判断+分类讨论
这个题的数据,太卡了,TLE了两晚上,各种调试优化,各种蛋疼. 2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit ...
- UVa 10256 (判断两个凸包相离) The Great Divide
题意: 给出n个红点,m个蓝点.问是否存在一条直线使得红点和蓝点分别分布在直线的两侧,这些点不能再直线上. 分析: 求出两种点的凸包,如果两个凸包相离的话,则存在这样一条直线. 判断凸包相离需要判断这 ...
- codeforces 8D Two Friends 二分+ 判断三个圆是否有公共交点
题目链接 有两个人x, y, 现在在A点, x要直接去B点, y要先去C点在去B点, 现在给出x, y两人可以行走的最大距离T1, T2, 求出他们从A点出发之后, 可以走的最长的公共路径. 我们先看 ...
- K - Video Reviews Gym - 101755K (二分)
题目链接: K - Video Reviews Gym - 101755K 题目大意: 一家公司想让个人给他们的产品评论,所以依次去找这个人,第i个人会评论当且仅当已经有个人评论或他确实对这个产品感兴 ...
随机推荐
- c/c++面试12-18------关与sizeof那些事儿
12 使用sizeof计算普通变量所占空间大小 (1)不同数据类型所占字节数不同(32位 64位系统不同) int----->4 double----->8 char-------> ...
- 快速打开和关闭SQL服务
将下面文本复制到txt中,然后将文本文件另存为bat @echo off for /f "skip=3 tokens=4" %%i in ('sc query MSSQLSERVE ...
- Apple Mach-O Linker Warning 警告解决办法
此警告解决办法: 项目名字 -> targets -> Build Settings -> search path
- win10+PHP 安装redis
1.给php环境安装redis扩展 2.给电脑安装redis环境 一.为php安装redis服务 使用 phpinfo() 函数查看php对应的版本 二.去下面的两个网站下载对应版本的压缩包并解压(注 ...
- 51nod 1031+斐波那契和杨辉三角的一些基础知识
直接斐波那契... #include<stdio.h> #include<queue> #include<string.h> #include<iostrea ...
- [Xcode 实际操作]二、视图与手势-(8)UIView视图的纹理填充
目录:[Swift]Xcode实际操作 本文将演示将导入的图片作为纹理,平铺整个屏幕. 往项目中导入一张图片. 点击底部左下角的图标->[Import]->选择需要导入的图片->[O ...
- [Xcode 实际操作]九、实用进阶-(16)给图片添加水印效果
目录:[Swift]Xcode实际操作 本文将演示如何截取屏幕画面,并将截取图片,存入系统相册. 在项目文件夹[DemoApp]上点击鼠标右键 ->[New File]创建一个扩展文件-> ...
- js中 call() ,apply(),bing()方法三者的用法和区别
面试中经常会被问到的,或者做笔试题的时候也会有这样的问题,所以今天专门对这个问题做个总结: 先看个例子: var age = '19' var myObj = { name:'小赖', myAge:t ...
- ebullient(2018.10.25)
结论巨好想,每一次操作可以看作把一个b往前移一位,另一个b往后移一位,逆序对个数不改变,判断即可做第一问. 此处代码仅给出第一问做法: #include<cstdio> #include& ...
- AOP 应用
AOP 的核心:解耦 1. 权限认证2. 事务3. 日志4. Lazy loading 懒加载5. Context Process 上下文处理6. Error Handler 错误追踪(异常捕获)7. ...