令 \(a\in A,b\in B\) 则移动向量 \(\omega\) 使得存在 \(b+\omega=a\)

那么 \(\omega\) 需要满足 \(\omega=a−b\)

黑科技:闵可夫斯基和

直接构造闵可夫斯基和 \(C={a+(−b)}\)

余下问题便是判断输入的移动向量是否在 \(C\) 内

可以强行使凸包的最下面为 \((0,0)\),这样只要找到与坐标轴夹角最接近的边就好了

# include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn(2e5 + 5);
const double eps(1e-13);
const double pi(acos(-1));
const double inf(1e15); struct Point2D {
double x, y; inline Point2D(double _x = 0, double _y = 0) {
x = _x, y = _y;
} inline Point2D operator +(Point2D ad) const {
return Point2D(x + ad.x, y + ad.y);
} inline Point2D operator -(Point2D ad) const {
return Point2D(x - ad.x, y - ad.y);
} inline double operator ^(Point2D ad) const { //dot
return x * ad.x + y * ad.y;
} inline double operator *(Point2D ad) const { //cross
return x * ad.y - y * ad.x;
} inline Point2D operator *(double ad) const {
return Point2D(x * ad, y * ad);
} inline double Len() {
return sqrt(x * x + y * y);
} inline double Angle() {
return atan2(y, x);
}
}; struct Segment2D {
Point2D x, y; inline Segment2D(Point2D _x = Point2D(0, 0), Point2D _y = Point2D(0, 0)) {
x = _x, y = _y;
}
}; inline Point2D CrossPoint2D(Segment2D a, Segment2D b) {
double k1, k2, t;
k1 = (b.y - a.x) * (a.y - a.x);
k2 = (a.y - a.x) * (b.x - a.x);
t = k2 / (k1 + k2);
return b.x + (b.y - b.x) * t;
} Point2D tmp[maxn]; inline int Cmp(Point2D x, Point2D y) {
return (x - tmp[1]) * (y - tmp[1]) > 0;
} inline void Graham(Point2D *a, int &len) {
int l = 0, mn = 0, i;
for (i = 1; i <= len; ++i)
if (!mn || (a[i].x < a[mn].x || (a[i].x == a[mn].x && a[i].y < a[mn].y))) mn = i;
swap(a[1], a[mn]), tmp[l = 1] = a[1], sort(a + 2, a + len + 1, Cmp);
for (i = 2; i <= len; ++i) {
while (l > 1 && (a[i] - tmp[l - 1]) * (tmp[l] - tmp[l - 1]) >= 0) --l;
tmp[++l] = a[i];
}
for (i = 1; i <= l; ++i) a[i] = tmp[i];
len = l;
} int n, m, q, len;
Point2D a[maxn], b[maxn], c[maxn], p; inline void Minkowski() {
int i, j;
c[len = 1] = a[1] + b[1], a[0] = a[1], b[0] = b[1];
for (i = 1; i < n; ++i) a[i] = a[i + 1] - a[i];
for (i = 1; i < m; ++i) b[i] = b[i + 1] - b[i];
a[n] = a[0] - a[n], b[m] = b[0] - b[m];
for (i = j = 1; i <= n || j <= m; )
if (j > m || (i <= n && a[i] * b[j] >= 0)) ++len, c[len] = c[len - 1] + a[i++];
else ++len, c[len] = c[len - 1] + b[j++];
} inline int Query() {
int l, r, mid, cur = 2;
p = p - c[1];
if (c[len] * p > 0 || p * c[2] > 0) return 0;
l = 2, r = len - 1;
while (l <= r) {
mid = (l + r) >> 1;
if (c[mid] * p > 0) l = mid + 1, cur = mid;
else r = mid - 1;
}
return (p - c[cur]) * (c[cur + 1] - c[cur]) <= 0;
} int main() {
int i;
scanf("%d%d%d", &n, &m, &q);
for (i = 1; i <= n; ++i) scanf("%lf%lf", &a[i].x, &a[i].y);
for (i = 1; i <= m; ++i) scanf("%lf%lf", &b[i].x, &b[i].y), b[i] = b[i] * -1;
Graham(a, n), Graham(b, m), Minkowski(), Graham(c, len);
for (i = 2; i <= len; ++i) c[i] = c[i] - c[1];
for (i = 1; i <= q; ++i) scanf("%lf%lf", &p.x, &p.y), printf("%d\n", Query());
return 0;
}

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

  1. [BZOJ5317][JSOI2018]部落战争(闵可夫斯基和)

    对于点集$A$,$B$,闵可夫斯基和$C=\{(x1+x2,y1+y2)|(x1,x2)\in A,(y1,y2)\in B\}$.由此可知,对于两个凸包$A$,$B$的闵可夫斯基和$C$满足,$C$ ...

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

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

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

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

  4. [JSOI2018]战争(闵可夫斯基和)

    害怕,可怜几何题 果然不会 题目就是说给你两个凸包,每次询问给你一个向量 \(c\) 问你能不能从两个凸包 \(A\) , \(B\) 里分别找到一个点 \(a\) , \(b\) 满足 \(a+c= ...

  5. 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 ...

  6. P4557 [JSOI2018]战争

    首先可以题目描述的两个点集是两个凸包,分别设为A和B. 考虑一个向量w不合法的条件. 即存在b+w=a,其中a属于A,b属于B. 也就是a-b=w. 即对b取反后和a的闵可夫斯基和. 求出闵可夫斯基和 ...

  7. [JSOI2018]战争

    题目描述 九条可怜是一个热爱读书的女孩子. 在她最近正在读的一本小说中,描述了两个敌对部落之间的故事.第一个部落有 nnn 个人,第二个部落有 mmm 个人,每一个人的位置可以抽象成二维平面上坐标为 ...

  8. 【LuoguP4557】[JSOI2018]战争

    题目链接 题意 给你两个点集. q次询问 , 每次把其中一个点集往一个方向移动 , 问两个点集的凸包还有没有交. Sol 闵可夫斯基和板子题. 把问题做如下转换: 我们本来两个凸包相交是相当于是对于移 ...

  9. 计算几何细节梳理&模板

    点击%XZY巨佬 向量的板子 #include<bits/stdc++.h> #define I inline using namespace std; typedef double DB ...

随机推荐

  1. Kafka迁移与扩容工具用法

    1.迁移topic到新增的node上 假如现在一个kafka集群运行三个broker,broker.id依次为101,102,103,后来由于业务数据突然暴增,需要新增三个broker,broker. ...

  2. HttpClient调用IdentityServer4获取Token并调用接口

    using System; using System.Net.Http; using IdentityModel.Client; namespace ClientCredential { class ...

  3. 第八天,scrapy的几个小技巧

    一. 微博模拟登陆 1. 百度搜微博开放平台可满足爬取量不大的情况 2. 微博模拟登陆和下拉鼠标应对ajax加载 from selenium import webdriver import time ...

  4. 【9】JMicro微服务-发布订阅消息服务

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. JMicro消息服务目前实现特性 a. JMicro只支持发布订阅消息服务,不支持队列式消息服务: b. 不支持消息持 ...

  5. 【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP

    上一篇blog已经讲了单调队列与单调栈的用法,本篇将讲述如何借助单调队列优化dp. 我先丢一道题:bzoj1855 此题不难想出O(n^4)做法,我们用f[i][j]表示第i天手中持有j只股票时,所赚 ...

  6. easyui 中iframe嵌套页面,提示弹窗遮罩的解决方法,parent.$.messager.alert和parent.$.messager.confirm

    项目中用到easyui 布局,用到north,west,center三个区域,且在center中间区域嵌入iframe标签.在主内容区做一些小提示弹窗(例如删除前的弹窗提示确认)时,会遇到遮罩问题,由 ...

  7. 简单shell expect程序

    1 expect程序 用的Ubuntu,本身没带expect,安装. sudo apt-get install expect (关于expect,参见http://www.tclchina.com/a ...

  8. Java之集合(五)LinkedList

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7298017.html 1.前言 Java中另一个常见的list就是本章将要讲的LinkedList.ArrayL ...

  9. Git-基本操作(图文)

    场景一: 已经用git add 命令把文件加入到暂存区了,这个时候想退回怎么办? 添加文件到暂存区 :git add . 将单个文件撤回到工作区:git rm --cached [文件路径] 将目录撤 ...

  10. 如何自学计算机科学与技术(Teach Yourself Computer Science)

    如果你是一个自学成才的半吊子,或者是从培训班毕业的小菜鸟.那么,你欠自己一份计算机科学的专业知识.感谢上帝,如今你可以接受世界水平的计算机教育,但无需花费数年时间和一笔不小的金钱. 互联网上的学习资源 ...