对于点集$A$,$B$,闵可夫斯基和$C=\{(x1+x2,y1+y2)|(x1,x2)\in A,(y1,y2)\in B\}$。
由此可知,对于两个凸包$A$,$B$的闵可夫斯基和$C$满足,$C$中的向量是所有$A$中向量与$B$中向量的和的并集。可以证明,$C$也是一个凸包。
现在问题是要求,对于询问向量$\vec{d}$,是否存在$\vec{a}\in A$,$\vec{b}\in B$,使得$\vec{a}=\vec{b}+\vec{d}$。
移项得$\vec{d}=\vec{a}-\vec{b}$,发现这是$B$中所有向量取反后与$A$的闵可夫斯基和。于是问题转化为,求$A$与$-B$的闵可夫斯基和$C$,并快速判断某个向量是否在$C$内。
求闵可夫斯基和有一个线性算法,正确性不会证明。
先求出$A$和$B$的凸包,再取出凸包上所有的边,这些边显然都分别是已经按极角排好序的向量。
初始时$C$只有一个点$\vec{a1}+\vec{b1}$,其中$a1$,$b1$分别是$A$和$B$凸包中的第一个点。
接下来类似归并排序地,按极角序从小到大依次插入新向量并维护凸包。
最后,凸包的尾部可能会出现一些多余点,直接删除或再求一次凸包即可。
得到凸包$C$后,问题只剩快速判断一个点$P$是否在凸包$C$内了。
很简单,将凸包中点以相对于凸包第一个点的极角序排好,二分找到$P$在其中哪个位置,向量叉积即可判断。
总复杂度$O(n\log n)$

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
int n,m,q,tot;
struct P{ ll x,y; }s,p[N],p1[N],p2[N],v1[N],v2[N],t[N],a[N];
P operator +(const P &a,const P &b){ return (P){a.x+b.x,a.y+b.y}; }
P operator -(const P &a,const P &b){ return (P){a.x-b.x,a.y-b.y}; }
ll operator *(const P &a,const P &b){ return a.x*b.y-a.y*b.x; }
ll len(P a){ return a.x*a.x+a.y*a.y; } bool cmp(const P &a,const P &b){ ll k=(a-s)*(b-s); return k ? k> : len(a-s)<len(b-s); } int Graham(P a[],int n){
rep(i,,n) t[i]=a[i];
rep(i,,n) if (t[i].x<t[].x || (t[i].x==t[].x && t[i].y<t[].y)) swap(t[],t[i]);
s=t[]; sort(t+,t+n+,cmp); int top=;
rep(i,,n){
while (top> && (t[top]-t[top-])*(t[i]-t[top-])<=) top--;
t[++top]=t[i];
}
rep(i,,top) a[i]=t[i];
return top;
} bool jud(P x){
P vx=x-p[];
if (vx*(p[tot]-p[])< || vx*(p[]-p[])>) return ;
int px=lower_bound(p+,p+tot+,x,cmp)-p-;
return (x-p[px])*(p[px%tot+]-p[px])<=;
} int main(){
freopen("bzoj5317.in","r",stdin);
freopen("bzoj5317.out","w",stdout);
scanf("%d%d%d",&n,&m,&q);
rep(i,,n) scanf("%lld%lld",&p1[i].x,&p1[i].y);
rep(i,,m) scanf("%lld%lld",&p2[i].x,&p2[i].y),p2[i].x=-p2[i].x,p2[i].y=-p2[i].y;
n=Graham(p1,n); m=Graham(p2,m);
rep(i,,n-) v1[i]=p1[i+]-p1[i]; v1[n]=p1[]-p1[n];
rep(i,,m-) v2[i]=p2[i+]-p2[i]; v2[m]=p2[]-p2[m];
p[]=p1[]+p2[]; tot=;
int l1=,l2=;
while (l1<=n || l2<=m)
tot++,p[tot]=p[tot-]+((l1<=n && (l2>m || (v1[l1]*v2[l2]>=))) ? v1[l1++] : v2[l2++]);
while (tot> && (p[tot]-p[tot-])*(p[]-p[tot-])<=) tot--;
s=p[]; P qs;
rep(i,,q) scanf("%lld%lld",&qs.x,&qs.y),printf("%d\n",jud(qs));
return ;
}

[BZOJ5317][JSOI2018]部落战争(闵可夫斯基和)的更多相关文章

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

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

  2. 2019.02.21 bzoj5317: [Jsoi2018]部落战争(凸包+Minkowski和)

    传送门 题意:qqq次询问把一个凸包整体加一个向量(x,y)(x,y)(x,y)之后是否与另外一个凸包相交. 思路:转化一下发现只要会求A+B={v⃗=a⃗+b⃗∣a⃗∈A,b⃗∈B}A+B=\{\v ...

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

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

  4. BZOJ 5317: [Jsoi2018]部落战争

    传送门 写出式子,若存在 $a \in A$,$b \in B$,使得 $b+v=a$,那么此方案会产生冲突 即存在 $a \in A$,$b \in B$,使得 $v=a+(-b)$,设 $C=A+ ...

  5. 「JSOI2018」战争

    「JSOI2018」战争 解题思路 我们需要每次求给一个凸包加上一个向量后是否与另外一个凸包相交,也就是说是否存在 \[ b\in B,(b+w)\in A \] 这里 \(A, B\) 表示凸包内部 ...

  6. BZOJ2150: 部落战争

    题解: 把每个点拆成入点和出点,因为必须经过一次且只能经过一次.所以在两个点之间连一条上界=下界=1的边. 然后再s到每个入点连边,每个出点向t连边,点与点之间... 求最小流就可以过了... (感觉 ...

  7. BZOJ 2150: 部落战争 最大流

    2150: 部落战争 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...

  8. BZOJ-2150部落战争(最小路径覆盖)

    2150: 部落战争 Time Limit: 10 Sec  Memory Limit: 259 MB Description lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国 ...

  9. 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】

    P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...

随机推荐

  1. 差分约束系统 + spfa(A - Layout POJ - 3169)

    题目链接:https://cn.vjudge.net/contest/276233#problem/A 差分约束系统,假设当前有三个不等式 x- y <=t1 y-z<=t2 x-z< ...

  2. 【黑客免杀攻防】读书笔记15 - 源码免杀、C++壳的编写

    1.源码免杀 1.1 定位产生特征的源码 定位文件特征 1.根据MyCCL的特征码定位工具,定位出有特征的地址 2.根据VS的反汇编窗口,输入有特征的地址得到特征地址与源码的关系 3.插入Messag ...

  3. CentOS_5.5_安装GCC编译LiME

    1 概述 近期遇到个使用CentOS 5.5的系统,生产环境没有GCC.GDB.要对这台机器抓取关键内存回去用volatility分析. 思路1:使用工具Dump某个进程的内存.使用cat /proc ...

  4. UBIFS文件系统简介 与 利用mkfs.ubifs和ubinize两个工具制作UBI镜像 (完整理解版本)

    UBI文件系统简介 在linux-2.6.27以前,谈到Flash文件系统,大家很多时候多会想到cramfs.jffs2.yaffs2等文件系统. 它们也都是基于文件系 统+mtd+flash设备的架 ...

  5. python 中的__del__

    # -*- coding: utf-8 -*- # @Time : 2018/9/19 20:21 # @Author : cxa # @File : delDemo.py # @Software: ...

  6. InfluxDB系列之一安装及简单运维(未完成,需要继续写)

    InfluxDB 是一个开源分布式时序.事件和指标数据库.使用 Go 语言编写,无需外部依赖.其设计目标是实现分布式和水平伸缩扩展. 它有三大特性: 1. Time Series (时间序列):你可以 ...

  7. 08 Packages 包

    Packages   Standard library Other packages Sub-repositories Community Standard library Name Synopsis ...

  8. Codeforces 580D Kefa and Dishes(状态压缩DP)

    题目链接:http://codeforces.com/problemset/problem/580/D 题目大意:有n盘菜每个菜都有一个满意度,k个规则,每个规则由x y c组成,表示如果再y之前吃x ...

  9. Java事务管理之Hibernate

    环境与版本 Hibernate 版本:Hibernate 4.2.2 (下载后的文件名为hibernate-release-4.2.2.Final.zip,解压目录hibernate-release- ...

  10. Jquery Datatable添加复选框,实现批量操作。

    最近一段时间,一直在写前端的东西,自己也不擅长,最近也有所长进,把工作中用到的一些前端知识整理一下,下次用到就不用再找了.这次主要是在datatable中添加复选框,然后实现批量操作的功能.因为是公司 ...