#凸包,闵可夫斯基和#CF87E Mogohu-Rea Idol
题目
按逆时针顺序给出三个凸包点集 \(\mathbb{A,B,C}\),每次查询给出点 \(D\),
问是否存在点 \(A\in\mathbb{A},B\in\mathbb{B},C\in\mathbb{C}\) 满足 \(D\) 为 \(\Delta{ABC}\) 的重心。
分析
考虑重心的坐标就是 \((\frac{x_1+x_2+x_3}{3},\frac{y_1+y_2+y_3}{3})\)
那么如果将 \(D\) 的坐标扩大三倍,那么也就是问 \(\mathbb{A,B,C}\) 三个凸包按照坐标分别相加组装成一个新的凸包,点 \(D\) 是否在这个凸包中。
可以发现三个凸包可以直接利用闵可夫斯基和合并起来,然后判断点是否位于多边形内部即可
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=150011;
typedef long long lll; int n,m,_n;
struct Point{
lll x,y;
inline Point operator -(const Point &t)const{
return (Point){x-t.x,y-t.y};
}
inline Point operator +(const Point &t)const{
return (Point){x+t.x,y+t.y};
}
}a[3][N],_a[N],b[N],B,seg[2][N];
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline lll Dis(Point x){return x.x*x.x+x.y*x.y;}
inline lll cj(Point x,Point y){return x.x*y.y-x.y*y.x;}
inline lll dj(Point x,Point y){return x.x*y.x+x.y*y.y;}
bool cmp(Point x,Point y){
rr lll t=cj(x-B,y-B);
return t>0||(!t&&Dis(x-B)<Dis(y-B));
}
inline bool within(Point p){
rr Point _p=p-a[2][1];
if (cj(_p,_a[2])>0||cj(_p,_a[_n])<0) return 0;
rr int l=2,r=_n-1;
while (l<=r){
rr int mid=(l+r)>>1;
if (cj(_p,_a[mid])<=0&&cj(_p,_a[mid+1])>=0)
return cj(_a[mid+1]-_p,_a[mid]-_p)<=0;
else if (cj(_p,_a[mid])>0) r=mid-1;
else l=mid+1;
}
return 0;
}
inline void Convex(Point *a,int &n){
rr int o=1,Top;
for (rr int i=2;i<=n;++i)
if (a[i].x<a[o].x||(a[i].x==a[o].x&&a[i].y<a[o].y)) o=i;
swap(a[o],a[1]),B=a[1],sort(a+2,a+1+n,cmp);
b[Top=1]=a[1];
for (rr int i=2;i<=n;++i){
while (Top>1&&cj(a[i]-b[Top-1],b[Top]-b[Top-1])>=0) --Top;
b[++Top]=a[i];
}
for (rr int i=1;i<=n;++i) a[i]=a[0]; n=Top;
for (rr int i=1;i<=Top;++i) a[i]=b[i],b[i]=a[0];
}
inline void Minkowski(){
for (rr int i=1;i<n;++i) seg[0][i]=a[0][i+1]-a[0][i]; seg[0][n]=a[0][1]-a[0][n];
for (rr int i=1;i<m;++i) seg[1][i]=a[1][i+1]-a[1][i]; seg[1][m]=a[1][1]-a[1][m];
rr int I=1,J=1;
a[2][_n=1]=a[0][1]+a[1][1];
for (;I<=n&&J<=m;++_n)
if (cj(seg[0][I],seg[1][J])>=0)
a[2][_n+1]=a[2][_n]+seg[0][I++];
else a[2][_n+1]=a[2][_n]+seg[1][J++];
for (;I<=n;++_n) a[2][_n+1]=a[2][_n]+seg[0][I++];
for (;J<=m;++_n) a[2][_n+1]=a[2][_n]+seg[1][J++];
}
signed main(){
n=iut(); for (rr int i=1;i<=n;++i) a[0][i]=(Point){iut(),iut()};
m=iut(); for (rr int i=1;i<=m;++i) a[1][i]=(Point){iut(),iut()};
Convex(a[0],n),Convex(a[1],m),Minkowski(),Convex(a[2],_n),n=_n,m=iut();
for (rr int i=1;i<=n;++i) a[0][i]=a[2][i];
for (rr int i=1;i<=m;++i) a[1][i]=(Point){iut(),iut()};
Convex(a[1],m),Minkowski(),Convex(a[2],_n);
for (rr int i=2;i<=_n;++i) _a[i]=a[2][i]-a[2][1];
for (rr int Q=iut();Q;--Q)
puts(within((Point){3*iut(),3*iut()})?"YES":"NO");
return 0;
}
#凸包,闵可夫斯基和#CF87E Mogohu-Rea Idol的更多相关文章
- 「题解」300iq Contest 2 H. Honorable Mention
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:gym102331H. 题意概述 给定一个长度为 \(n\) 的序列 \(a\),有 \(q\) 次询问,每次询问给定三个 ...
- 5.8 NOI 模拟
\(T1\) 比较容易想到的 二分转化为判定,判定是否存在一个子图能保证能一直在\(x\)时间内到达\(n\) 设\(dis(u,v)\)表示\(u->v\)的最短路 先找出候选节点\(i,di ...
- 洛谷CF1071E Rain Protection(计算几何,闵可夫斯基和,凸包,二分答案)
洛谷题目传送门 CF题目传送门 对于这题,我无力吐槽. 虽然式子还是不难想,做法也随便口胡,但是一些鬼畜边界情况就是判不对. 首先显然二分答案. 对于每一个雨滴,它出现的时刻我们的绳子必须落在它上面. ...
- 【BZOJ5317】[JSOI2018]部落战争(凸包,闵可夫斯基和)
[BZOJ5317][JSOI2018]部落战争(凸包,闵可夫斯基和) 题面 BZOJ 洛谷 题解 很明显我们只需要两个凸包\(A,B\). 假设询问给定的方向向量是\(v\). 那么现在就是判断\( ...
- BZOJ2564: 集合的面积(闵可夫斯基和 凸包)
题意 题目链接 Sol 这个东西的学名应该叫"闵可夫斯基和".就是合并两个凸包 首先我们先分别求出给出的两个多边形的凸包.合并的时候直接拿个双指针扫一下,每次选最凸的点就行了. 复 ...
- 洛谷P4557 [JSOI2018]战争(闵可夫斯基和+凸包)
题面 传送门 题解 看出这是个闵可夫斯基和了然而我当初因为见到这词汇是在\(shadowice\)巨巨的\(Ynoi\)题解里所以压根没敢学-- 首先您需要知道这个 首先如果有一个向量\(w\)使得\ ...
- bzoj2564: 集合的面积(闵可夫斯基和 凸包)
题面 传送门 题解 花了一个下午的时间调出了一个稍微能看的板子--没办法网上的板子和咱的不太兼容-- 首先有一个叫做闵可夫斯基和的东西,就是给你两个点集\(A,B\),要你求一个点集\(C=\{x+y ...
- [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和
一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...
- 闵可夫斯基和(Mincowsky sum)
一.概述 官方定义:两个图形A,B的闵可夫斯基和C={a+b|a∈A,b∈B}通俗一点:从原点向图形A内部的每一个点做向量,将图形B沿每个向量移动,所有的最终位置的并便是闵可夫斯基和(具有交换律) 例 ...
- BZOJ5317 JSOI2018部落战争(凸包)
即询问凸包是否有交.这显然可以直接求半平面交,但是复杂度O(q(n+m)),且没有什么优化空间. 更直接地表示,即相当于询问是否存在点a∈A,b∈B,使得a+d=b.移项,得到d=b-a.可以发现等式 ...
随机推荐
- 理解[].forEach.call()并说明为什么要使用[].forEach.call()
[].forEach.call(elems, callback) 相当于: Array.prototype.forEach.call(elems, callback) 又相当于: function(e ...
- 【八股cover#4】OS Q&A与知识点
OS Q&A与知识点 重点知识 进程 概念 我们编译的代码可执行文件只是储存在硬盘的静态文件,运行时被加载到内存,CPU执行内存中指令,这个运行的程序被称为进程. 进程是对运行时程序的封装 ...
- 第一百一十一篇:基本引用类型Date
好家伙,本篇为<JS高级程序设计>第五章的学习笔记 1.基本引用类型 引用值(或者对象)是某个特定引用类型的实例,在ECMAScript中,引用类型是把数据和功能组织到一起的结构,(像 ...
- 1. JVM体系结构
1. 前言 作为Java工程师 ,jvm对于 java的重要性不言而喻,但是 我们又对jvm了解多少 Java的跨平台性 java发布的口号 "一处编译到处运行 " 依赖于jvm, ...
- 16. Class字节码结构
1. 相关概念 1.1字节码文件的跨平台性 Java 语言是跨平台的(write once, run anywhere) 当 Java 源代码成功编译成字节码后,如果想在不同的平台上面运行, 则无须再 ...
- .Net下的简易Http请求调用(Post与Get)
http请求调用是开发中经常会用到的功能.在内,调用自有项目的Web Api等形式接口时会用到:在外,调用一些第三方功能接口时,也会用到,因为,这些第三方功能往往是通过http地址的形式提供的,比如: ...
- 基于STM32F407MAC与DP83848实现以太网通讯一(STM32以太网(ETH)外设)
STM32F4xx 可以通过以太网按照 IEEE 802.3-2002 标准发送和接收数据.支持与外部物理层 (PHY) 相连的两个工业标准接口:默认情况下使用的介质独立接口 (MII)(在 IEEE ...
- 单词本z exploration plor,ploit — flow out ,weep
exploration plor,ploit - flow out ,weep 为什么 今天新学了个单词 exploration 很简单可以查出和 explore有关联 exploration n. ...
- stm32读写sd卡代码解析和调试总结
一 前言 做程序员真是来不得半点偷懒,假如你对经常使用的代码不熟悉,早晚会让你付出沉重的代价.像认识自己的灵魂一样认识每行用到的代码,这才是一个合格的程序员,才不至于在出现问题的时候出现慌乱. ...
- 2层for循环生成 TreeView
C# TreeView 利用2层for循环生成,代码如下: //生成树 treeView1.Nodes.Clear(); //封装了数据库查询方法 MyDS_Grid = MyDataClass.ge ...