题目

按逆时针顺序给出三个凸包点集 \(\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的更多相关文章

  1. 「题解」300iq Contest 2 H. Honorable Mention

    本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:gym102331H. 题意概述 给定一个长度为 \(n\) 的序列 \(a\),有 \(q\) 次询问,每次询问给定三个 ...

  2. 5.8 NOI 模拟

    \(T1\) 比较容易想到的 二分转化为判定,判定是否存在一个子图能保证能一直在\(x\)时间内到达\(n\) 设\(dis(u,v)\)表示\(u->v\)的最短路 先找出候选节点\(i,di ...

  3. 洛谷CF1071E Rain Protection(计算几何,闵可夫斯基和,凸包,二分答案)

    洛谷题目传送门 CF题目传送门 对于这题,我无力吐槽. 虽然式子还是不难想,做法也随便口胡,但是一些鬼畜边界情况就是判不对. 首先显然二分答案. 对于每一个雨滴,它出现的时刻我们的绳子必须落在它上面. ...

  4. 【BZOJ5317】[JSOI2018]部落战争(凸包,闵可夫斯基和)

    [BZOJ5317][JSOI2018]部落战争(凸包,闵可夫斯基和) 题面 BZOJ 洛谷 题解 很明显我们只需要两个凸包\(A,B\). 假设询问给定的方向向量是\(v\). 那么现在就是判断\( ...

  5. BZOJ2564: 集合的面积(闵可夫斯基和 凸包)

    题意 题目链接 Sol 这个东西的学名应该叫"闵可夫斯基和".就是合并两个凸包 首先我们先分别求出给出的两个多边形的凸包.合并的时候直接拿个双指针扫一下,每次选最凸的点就行了. 复 ...

  6. 洛谷P4557 [JSOI2018]战争(闵可夫斯基和+凸包)

    题面 传送门 题解 看出这是个闵可夫斯基和了然而我当初因为见到这词汇是在\(shadowice\)巨巨的\(Ynoi\)题解里所以压根没敢学-- 首先您需要知道这个 首先如果有一个向量\(w\)使得\ ...

  7. bzoj2564: 集合的面积(闵可夫斯基和 凸包)

    题面 传送门 题解 花了一个下午的时间调出了一个稍微能看的板子--没办法网上的板子和咱的不太兼容-- 首先有一个叫做闵可夫斯基和的东西,就是给你两个点集\(A,B\),要你求一个点集\(C=\{x+y ...

  8. [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和

    一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...

  9. 闵可夫斯基和(Mincowsky sum)

    一.概述 官方定义:两个图形A,B的闵可夫斯基和C={a+b|a∈A,b∈B}通俗一点:从原点向图形A内部的每一个点做向量,将图形B沿每个向量移动,所有的最终位置的并便是闵可夫斯基和(具有交换律) 例 ...

  10. BZOJ5317 JSOI2018部落战争(凸包)

    即询问凸包是否有交.这显然可以直接求半平面交,但是复杂度O(q(n+m)),且没有什么优化空间. 更直接地表示,即相当于询问是否存在点a∈A,b∈B,使得a+d=b.移项,得到d=b-a.可以发现等式 ...

随机推荐

  1. 关于谷歌浏览器出现“错误代码:net::ERR_UNSAFE_PORT”的解决办法

    搭建项目时需要自己配置端口信息,但是有人搭建之后会出现如下情况 但是换用edge等浏览器没有问题,这是因为chorme浏览器有自己的默认非安全端口, 若访问这些端口就会出现这个错误,并且所有采用cho ...

  2. Anaconda下载安装步骤

    下载地址 下载比较慢的,用迅雷下,点击复制地址,然后在迅雷里面直接创建连接 Anaconda基于python3.8 Anaconda基于python3.6的 安装步骤 没啥说的,一路安装,中间有个勾选 ...

  3. Advanced .Net Debugging 2:CLR基础

    一.简介 这是2024新年后我的第一篇文章,也是我的<Advanced .Net Debugging>这个系列的第二篇文章.这篇文章告诉我们为了进行有效的程序调试,我们需要掌握哪些知识.言 ...

  4. C C++指针面试题零碎整理

    最基础的指针如下: int a; int* p = &a; 答:p指向a的地址,&是取a的地址.*指的是指针中取内容的符号. 2.str[]和str*的区别: char str1[] ...

  5. Java是解释型语言么

    基础概念 JVM虚拟机会将.java类文件编译成.class文件--字节码文件,这大家都知道. 代码运行时还需要将.class字节码文件翻译成机器码才能执行. 解释执行:将编译好的字节码一行一行地翻译 ...

  6. 【Azure 服务总线】如何批量删除Azure Service Bus中的Topics(数量较多,需要过滤后批量删除)

    问题描述 Azure Service Bus 的门户操作页面上,是否可以批量删除其中的Topics呢? 问题解答 Azure Service Bus门户或Service Bus Explorer工具没 ...

  7. Task Manager 的设计简述

    讲解 Task Manager 之前,在这里先介绍一些 Task Manager 会使用到的概念术语. 图数据库 Nebula Graph 中,存在一些长期在后台运行的任务,我们称之为 Job.存储层 ...

  8. CTF中常见编码

    ASCII编码 ASCII HEX DEC flag{hello_ctfer} 66 6c 61 67 7b 68 65 6c 6c 6f 5f 63 74 66 65 72 7d 102 108 9 ...

  9. Docker安装好后服务启动不了

    安装 安装方式参考地址:https://www.docker.org.cn/book/install/install-docker-on-rhel-29.html 问题 安装好后启动不了服务器.查看状 ...

  10. sqlserver 查看执行计划

    -- 清除执行计划缓存 DBCC FREEPROCCACHE -- 查看缓存执行计划 SELECT * FROM sys.dm_exec_cached_plans as p CROSS APPLY s ...