题目描述

九条可怜是一个热爱读书的女孩子。

在她最近正在读的一本小说中,描述了两个敌对部落之间的故事。第一个部落有 nnn 个人,第二个部落有 mmm 个人,每一个人的位置可以抽象成二维平面上坐标为 (xi,yi)(x_i,y_i)(xi​,yi​) 的点。

在这本书中,人们有很强的领地意识,对于平面上的任何一个点,如果它被三个来自同一部落的人形成的三角形(可能退化成一条线段)包含(包括边界),那么这一个点就属于这一个部落的领地。如果存在一个点同时在两个阵营的领地中,那么这两个部落就会为了争夺这一个点而发生战争。

常年的征战让两个部落不堪重负,因此第二个部落的族长作出了一个英明的决定,他打算选择一个向量 (dx,dy)(dx,dy)(dx,dy) ,让所有的族人都迁徙这个向量的距离,即所有第二阵营的人的坐标都变成 (xi+dx,yi+dy)(x_i+dx,y_i+dy)(xi​+dx,yi​+dy) 。

现在他计划了 qqq 个迁徙的备选方案,他想要你来帮忙对每一个迁徙方案,计算一下在完成了迁徙之后,两个部落之间还会不会因为争夺领地而发生战争。

输入格式

第一行输入三个整数 n,m,qn,m,qn,m,q,表示两个部落里的人数以及迁徙的备选方案数。

接下来 nnn 行每行两个整数 xi,yix_i,y_ixi​,yi​​​ 表示第一个部落里的人的坐标。

接下来 mmm 行每行两个整数 xi,yix_i,y_ixi​,yi​​​ 表示第二个部落里的人的坐标。

接下来 qqq 行每行两个整数 dxi,dyidx_i,dy_idxi​,dyi​​​ 表示一个迁徙方案。

输入数据保证所有人的坐标两两不同。

输出格式

对于每个迁徙方案,输出一行一个整数,000 表示不会发生冲突,111 表示会发生冲突。

输入输出样例

输入 #1

4 4 3
0 0
1 0
0 1
1 1
-1 0
0 3
0 2
0 -1
0 0
2 3
0 -1
输出 #1
1
0
设a,b为两个部落构成的凸包
b+d=a等价于d=a-b
即取反b,求出凸包,再用Minkowski和合并两凸包
查询用二分查询向量d所在区间,用叉积判断是否在凸包内
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lol;
struct Node
{
lol x,y;
Node operator + (const Node &b) const
{
return (Node){x+b.x,y+b.y};
}
Node operator - (const Node &b) const
{
return (Node){x-b.x,y-b.y};
}
}a[],b[],sa[],sb[],sta[],bs,s1[],s2[],s[];
int n,m,q,top;
bool cmp(Node a,Node b)
{
if (a.y==b.y) return a.x<b.x;
return a.y<b.y;
}
lol cross(Node a,Node b)
{
return (a.x*b.y-a.y*b.x);
}
lol dist(Node a)
{
return a.x*a.x+a.y*a.y;
}
bool cmp1(Node A,Node B)
{
lol t=cross((a[]-A),(a[]-B));
if (t==) return dist(a[]-A)<dist(a[]-B);
return t>;
}
bool cmp2(Node A,Node B)
{
lol t=cross((b[]-A),(b[]-B));
if (t==) return dist(b[]-A)<dist(b[]-B);
return t>;
}
int grahama(int N)
{int i;
sort(a+,a+N+,cmp);
sort(a+,a+N+,cmp1);
top=;
sa[++top]=a[];
if (N==) return ;
sa[++top]=a[];
for (i=;i<=N;i++)
{
while (top>&&cross(a[i]-sa[top-],sa[top]-sa[top-])>=) top--;
top++;
sa[top]=a[i];
}
sa[top+]=a[];
return top;
}
int grahamb(int N)
{int i;
sort(b+,b+N+,cmp);
sort(b+,b+N+,cmp2);
top=;
sb[++top]=b[];
if (N==) return ;
sb[++top]=b[];
for (i=;i<=N;i++)
{
while (top>&&cross(b[i]-sb[top-],sb[top]-sb[top-])>=) top--;
top++;
sb[top]=b[i];
}
sb[top+]=b[];
return top;
}
bool cmpp(Node A,Node B)
{
lol t=cross((s[]-A),(s[]-B));
if (t==) return dist(s[]-A)<dist(s[]-B);
return t>;
}
int grahams(int N)
{int i;
sort(s+,s+N+,cmp);
sort(s+,s+N+,cmpp);
top=;
sta[++top]=s[];
if (N==) return ;
sta[++top]=s[];
for (i=;i<=N;i++)
{
while (top>&&cross(s[i]-sta[top-],sta[top]-sta[top-])>=) top--;
top++;
sta[top]=s[i];
}
sta[top+]=s[];
return top;
}
bool cmp3(Node A,Node B)
{
return cross(A,B)>||(cross(A,B)==&&dist(A)<dist(B));
}
lol find(Node A)
{
if(cross(A,sta[])>||cross(sta[top],A)>) return ;
lol ps=lower_bound(sta+,sta+top+,A,cmp3)-sta-;
return cross((A-sta[ps]),(sta[ps%top+]-sta[ps]))<=;
}
void Minkowski()
{
for(lol i=;i<n;i++) s1[i]=sa[i+]-sa[i];s1[n]=sa[]-sa[n];
for(lol i=;i<m;i++) s2[i]=sb[i+]-sb[i];s2[m]=sb[]-sb[m];
top=;
s[top]=sa[]+sb[];
lol i=,j=;
while(i<=n&&j<=m) ++top,s[top]=s[top-]+(cross(s1[i],s2[j])>=?s1[i++]:s2[j++]);
while(i<=n) ++top,s[top]=s[top-]+s1[i++];
while(j<=m) ++top,s[top]=s[top-]+s2[j++];
}
int main()
{int i,j;
lol dx,dy;
cin>>n>>m>>q;
for (i=;i<=n;i++)
scanf("%lld%lld",&a[i].x,&a[i].y);
for (i=;i<=m;i++)
scanf("%lld%lld",&b[i].x,&b[i].y),b[i].x=-b[i].x,b[i].y=-b[i].y;
n=grahama(n);
m=grahamb(m);
Minkowski();
top=grahams(top);
bs=sta[];
for (i=;i<=top;i++)
sta[i]=sta[i]-bs; for (i=;i<=q;i++)
{
scanf("%lld%lld",&dx,&dy);
if (find((Node){dx,dy}-bs))
printf("1\n");
else printf("0\n");
}
}

[JSOI2018]战争的更多相关文章

  1. P4557 [JSOI2018]战争

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

  2. BZOJ5317:[JSOI2018]战争(闵可夫斯基和)

    令 \(a\in A,b\in B\) 则移动向量 \(\omega\) 使得存在 \(b+\omega=a\) 那么 \(\omega\) 需要满足 \(\omega=a−b\) 黑科技:闵可夫斯基 ...

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

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

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

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

  5. 【LuoguP4557】[JSOI2018]战争

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

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

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

  7. HHHOJ #151. 「NOI模拟 #2」Nagisa

    计算几何板子题(我才没有拷板子的说--) 众所周知,三角形的重心坐标是\((\frac{x_1+x_2+x_3}{3},\frac{y_1+y_2+y_3}{3})\) 然后我们发现如果我们有一个点集 ...

  8. 【学习笔记】Minkowski和

    这还是个被我咕了N久的玩意 Minkowski和是一个奇怪的玩意 他长这样 $S={a+b \| a \in A , b \in B}$ AB可以是点集也可是向量集(显然) 他可以处理一些奇怪的东西 ...

  9. JSOI部分题解

    JSOI部分题解 JSOI2018 战争 问题转化为给定你两个凸包\(\mathbb S,\mathbb T\),每次独立的询问将\(\mathbb T\)中的每个点移动一个向量,问\(\mathbb ...

随机推荐

  1. LeetCode 946. 验证栈序列(Validate Stack Sequences) 26

    946. 验证栈序列 946. Validate Stack Sequences 题目描述 Given two sequences pushed and popped with distinct va ...

  2. c++ 初始化

    1. 内置类型默认初始化 内置类型如果没有被显示初始化,则会被编译器默认初始化.初始化会根据①变量类型的不同②变量类型位置,来决定初始化之后的值.但是内置类型如果在函数体内部,则将不被初始化——也就是 ...

  3. Django框架深入了解_02(DRF之序列化、反序列化)

    序列化:将Python对象准换成json格式的字符串,反之即为反序列化 DRF的序列化使用过程: 使用drf的序列化组件 -1 新建一个序列化类继承Serializer -2 在类中写要序列化的字段 ...

  4. 在bat批处理中简单的延时方法

    使用for命令: 延时1s左右的方法: @echo off echo %time% ,,) do echo %%i>nul echo %time% pause %time%是用来显示延时时间,实 ...

  5. 2019/7/18ACM集训

    2019-07-18 09:15:34 这个是练习刷的题 Vus the Cossack and Numbers Vus the Cossack has nn real numbers aiai. I ...

  6. C#在linux上运行实现

    1 C#开发完了服务 2 部署到linux centos7上 3无法直接运行 解决方法 1 linux cenos7上安装mono  2 执行mono xxx.exe 即可 解决方法2 下载 anye ...

  7. Java doc注释

    常用Java注释标签(Java comment tags) @author 作者 适用范围:文件.类.方法 (多个作者使用多个@author标签标识,java doc中显示按输入时间顺序罗列.) 例: ...

  8. 「CTS2019」珍珠

    「CTS2019」珍珠 解题思路 看了好多博客才会,问题即要求有多少种方案满足数量为奇数的变量数 \(\leq n-2m\).考虑容斥,令 \(F(k)\) 为恰好有 \(n\) 个变量数量为奇数的方 ...

  9. linq 动态排序 order by

    项目查询数据库使用的是linq 语法,可是后期需要用到不同字段的排序.各种纠结! 在网上找了各种资料 后面才找到两种方法 using System; using System.Collections. ...

  10. jquery easyui datagrid 在翻页以后仍能记录被选中的行及刷新设置选中行数据

    //easyUI的datagrid在复选框多选时,如何在翻页以后仍能记录被选中的行://注意datagrid中需要配置idField属性,一般为数据的主键 $.ajax({ type: 'GET', ...