#凸包,闵可夫斯基和#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.可以发现等式 ...
随机推荐
- 【LeetCode二叉树#18】修剪二叉搜索树(涉及重构二叉树与递归回溯)
修剪二叉搜索树 力扣题目链接(opens new window) 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R.通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) .你 ...
- MIG是如何向DDR中写入数据的
1.1 先来看看信号线的描述 我们以X16的器件为例,下面的截图来自 镁光的官方手册 https://media-www.micron.com/-/media/client/global/doc ...
- PMP考试计算题汇总
第6章 项目时间管理 本节术语较多.涉及的工具&技术也不少. 主要包括活动定义.活动排序.活动资源估算.活动历时估算.进度制定.进度控制6个子过程. 1.1活动定义:就是对WBS的进一步分解. ...
- 详细的BoltDB学习记录文档
最近项目中用到了boltdb这个go开发的key/value 数据库,但是之前并有接触过,所以特意去看了官方,也找了些资料,网上找的资料要不就是官方文档的翻译,要不就是简单的介绍一点,都不是很全,所以 ...
- 可视化学习:使用WebGL实现网格背景
前言 作为前端开发人员,我们最关注的就是应用的交互体验,而元素背景是最基础的交互体验之一.一般而言,能够使用代码实现的界面,我们都会尽可能减少图片的使用,这主要是有几方面的原因,第一,是图片会消耗更多 ...
- 牛客周赛34(A~E)
A 两种情况 两个字符相同只有2 两个字符不相同4 #include <bits/stdc++.h> #define int long long #define rep(i,a,b) fo ...
- html5与css3新特性
HTML5新特性 增加了一些新的标签.新的表单以及新的表单属性等 这些新特性都有兼容性问题,基本上IE9+以上版本浏览器才支持,如果不考虑兼容性问题,可以大量使用这些新特性 新增语义化标签 - < ...
- Zabbix“专家坐诊”第192期问答汇总
问题一 Q:请问下,客户机snmptrap发告警为啥server web收不到,关键是snmptrap日志已经收到,zabbix server配置以及开启snmptrap=1 snmptrap=var ...
- Spring 知识点
Spring Spring 是什么? Spring为了解决企业级应用的复杂性而创建,简化开发. 如下简化: 基于POJO的轻量级和最小侵入性编程: 以IoC(控制反转).DI(依赖注入)和面向接口实现 ...
- MyEclipse之各个版本的区别
跟Eclipse一样,MyEclipse的各个版本也是有区别的,他们所集成的插件是不同的. 从插件数量和功能的强大程度上讲:Blue>Professional>Standard MyEcl ...