传送门

写出式子,若存在 $a \in A$,$b \in B$,使得 $b+v=a$,那么此方案会产生冲突

即存在 $a \in A$,$b \in B$,使得 $v=a+(-b)$,设 $C=A+(-B)$ 那么有 $v \in C$,$+$ 表示闵可夫斯基和,$-$ 表示坐标符号取反

所有直接求出 $A$ 和 $-B$ 的闵可夫斯基和的凸包,然后查询 $v$ 是否在凸包内即可

注意直接求闵可夫斯基和的凸包可能会有一些平行的向量,为了方便查询,重新做一遍凸包即可

我的做法会把凸包坐标变化,所以查询的向量也要跟着变化

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef double db;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e5+;
struct poi {
ll x,y;
poi (ll a=,ll b=) { x=a,y=b; }
inline poi operator + (const poi &tmp) const { return poi(x+tmp.x,y+tmp.y); }
inline poi operator - (const poi &tmp) const { return poi(x-tmp.x,y-tmp.y); }
inline bool operator < (const poi &tmp) const { return x!=tmp.x ? x<tmp.x : y<tmp.y; }
}A[N],B[N],C[N],st[N],sum;
inline ll Cross(poi A,poi B) { return A.x*B.y-A.y*B.x; }
inline db Dot(poi A,poi B) { return A.x*B.x+A.y*B.y; }
inline db Len(poi A) { return sqrt(Dot(A,A)); }
inline bool cmp(const poi &A,const poi &B) { return Cross(A,B)>||(Cross(A,B)==&&Len(A)<Len(B)); }
void Tubao(poi *P,int &tot)
{
sort(P+,P+tot+); sum=sum+P[];/*如果此时求的是C的凸包P[1]=(0,0)没有贡献*/ for(int i=tot;i>=;i--) P[i]=P[i]-P[];
sort(P+,P+tot+,cmp); int Top=;
for(int i=;i<=tot;st[++Top]=P[i],i++)
while(Top> && Cross(P[i]-st[Top-],st[Top]-st[Top-])>= ) Top--;
tot=Top; for(int i=;i<=tot;i++) P[i]=st[i];
}
int check(poi *P,int tot,poi A)
{
A=A-sum;
if(Cross(A,P[])>||Cross(P[tot],A)>) return ;
int pos=lower_bound(P+,P+tot+,A,cmp)-P-; if(pos==tot) return ;
return Cross(A-P[pos],P[pos+]-P[pos])<=;
}
int n,m,T,Q;
int main()
{
n=read(),m=read(),Q=read();
for(int i=;i<=n;i++) A[i].x=read(),A[i].y=read();
for(int i=;i<=m;i++) B[i].x=-read(),B[i].y=-read();
Tubao(A,n); Tubao(B,m);
int la=,lb=; C[++T]=A[]+B[];
while(la<=n||lb<=m)
{
poi p1=A[la%n+]+B[(lb-)%m+],p2=A[(la-)%n+]+B[lb%m+];
if(Cross(p1-C[T],p2-C[T])>=) la++,C[++T]=p1;
else lb++,C[++T]=p2;
}
Tubao(C,T);
for(int i=;i<=Q;i++)
{
int x=read(),y=read();
printf("%d\n",check(C,T,poi(x,y)));
}
return ;
}

BZOJ 5317: [Jsoi2018]部落战争的更多相关文章

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

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

  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部落战争(凸包)

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

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

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

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

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

  6. BZOJ2150: 部落战争

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

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

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

  8. 「JSOI2018」战争

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

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

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

随机推荐

  1. 定时器的写法 winform

    private void timer1_Tick(object sender, EventArgs e) { if ( tttttflag) { Action action = SyncCompany ...

  2. php使用ob缓存来实现动态页面静态化

    php7中的php.ini 默认开启 output_buffering = 4096 例子: <?phpinclude_once 'common/common.php';//数据库操作方法 $f ...

  3. PHP开发环境 PHP培训教程

        PHP开发环境 兄弟连小编整理如下:   Centos安装apache,mysql,php环境 yum -y install httpd php mysql mysql-server php- ...

  4. JUnit——assertThat(acture,matcher)

    使用hamcrest之前需要引入相关的jar包,包括hamcrest-core.1.3.jar和hamcrest-library-1.3.jar. 具体引入的方法为:右击JUnit工程——build ...

  5. TTTTTTTTTTTTTT CDOJ Sliding Window 线段树(nlogn)或双端队列(n) 模板

    题目链接: L - Sliding Window Time Limit:6000MS     Memory Limit:131072KB     64bit IO Format:%lld & ...

  6. jodd cache实现缓存超时

    public class JoddCache { private static final int CACHE_SIZE = 2; private final static Cache<Obje ...

  7. ApiException

    ApiException 用于在catch中throw 异常,可以添加异常信息, throw new ApiException("线下绑卡异常!"); public class A ...

  8. 20175308 实验三《敏捷开发与XP实践》

    20175308 实验三<敏捷开发与XP实践> 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 完成实验.撰写实验 ...

  9. DB2创建视图并授权给其他用户

    创建视图并授权给其他用户 可以在操作系统界面.或者DB2交互界面下进行数据库操作 查看数据库节点[db2inst1@ELONEHR-DB ~]$ db2 list db directory Syste ...

  10. RAC+单实例场景下 DG主备切换,报ORA-01577

    SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMAR ...