传送门

题意:qqq次询问把一个凸包整体加一个向量(x,y)(x,y)(x,y)之后是否与另外一个凸包相交。


思路:转化一下发现只要会求A+B={v⃗=a⃗+b⃗∣a⃗∈A,b⃗∈B}A+B=\{\vec v=\vec a+\vec b|\vec a\in A,\vec b\in B\}A+B={v=a+b∣a∈A,b∈B}即可,这个要用到一个叫做MinkowskiMinkowskiMinkowski和的东西。

不会的可以画个图,发现最后的向量集组成的凸包每条边都是由A,BA,BA,B中的边拼成的,于是我们提出A,BA,BA,B的所有边然后归并一下即可。

代码:

#include<bits/stdc++.h>
#define int long long
#define ri register int
using namespace std;
inline int read(){
    int ans=0;
    bool f=1;
    char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f^=1;ch=getchar();}
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return f?ans:-ans;
}
typedef long long ll;
const int N=1e5+5;
struct pot{
    ll x,y;
    pot(ll _x=0,ll _y=0):x(_x),y(_y){};
    friend inline pot operator+(const pot&a,const pot&b){return pot(a.x+b.x,a.y+b.y);}
    friend inline pot operator-(const pot&a,const pot&b){return pot(a.x-b.x,a.y-b.y);}
    friend inline ll operator^(const pot&a,const pot&b){return a.x*b.y-a.y*b.x;}
    friend inline bool operator<(const pot&a,const pot&b){return a.x==b.x?a.y<b.y:a.x<b.x;}
}A[N<<1],a1[N],a2[N];
inline void graham(pot a[],int&n){
    static int q[N],top;
    static pot b[N];
    sort(a+1,a+n+1);
    q[top=1]=1;
    for(ri i=2;i<=n;++i){
        while(top>1&&((a[i]-a[q[top-1]])^(a[q[top]]-a[q[top-1]]))<=0)--top;
        q[++top]=i;
    }
    for(ri len=top,i=n-1;i;--i){
        while(top>len&&((a[i]-a[q[top-1]])^(a[q[top]]-a[q[top-1]]))<=0)--top;
        q[++top]=i;
    }
    n=top;
    for(ri i=1;i<=n;++i)b[i]=a[q[i]];
    memcpy(a,b,sizeof(b));
}
inline void Minkowski(pot a[],int&tot,pot x[],int n,pot y[],int m){
    static int pa,pb;
    a[tot=1]=x[pa=1]+y[pb=1];
    while(pa<n&&pb<m){
        pot ta=x[pa+1]-x[pa],tb=y[pb+1]-y[pb];
        ++tot;
        if((ta^tb)<=0)a[tot]=a[tot-1]+ta,++pa;
        else a[tot]=a[tot-1]+tb,++pb;
    }
    while(pa<n)++tot,a[tot]=a[tot-1]+x[pa+1]-x[pa],++pa;
    while(pb<m)++tot,a[tot]=a[tot-1]+y[pb+1]-y[pb],++pb;
    --tot;
    graham(a,tot);
    --tot;
}
int n,m,len,q;
inline bool check(const pot&p){
    if(((p-A[1])^(A[len]-A[1]))>0)return 0;
    if(((p-A[1])^(A[2]-A[1]))<0)return 0;
    int l=2,r=len-1,ans=2;
    while(l<=r){
        int mid=l+r>>1;
        if(((p-A[1])^(A[mid]-A[1]))>=0)l=mid+1,ans=mid;
        else r=mid-1;
    }
    return ((p-A[ans])^(A[ans+1]-A[ans]))>=0;
}
signed main(){
    n=read(),m=read(),q=read();
    for(ri i=1;i<=n;++i)a1[i].x=read(),a1[i].y=read();
    for(ri i=1;i<=m;++i)a2[i].x=-read(),a2[i].y=-read();
    graham(a1,n),graham(a2,m);
    Minkowski(A,len,a1,n,a2,m);
    for(ri x,y;q;--q)x=read(),y=read(),cout<<check(pot(x,y))<<'\n';
    return 0;
}


2019.02.21 bzoj5317: [Jsoi2018]部落战争(凸包+Minkowski和)的更多相关文章

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

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

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

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

  3. 2019.02.21 bzoj1249: SGU277 HERO 动态凸包(set+凸包)

    传送门 题意:动态插入点,维护凸包面积. 思路:用setsetset维护极角序来支持面积查询即可. 然后注意选原点的时候要从初始三个点随机平均系数来避免精度误差. 代码: #include<bi ...

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

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

  5. 2019.02.21 bzoj2300: [HAOI2011]防线修建(set+凸包)

    传送门 题意:动态维护凸包周长. 思路: 见这篇求面积的吧反正都是一个套路. 代码: #include<bits/stdc++.h> #define int long long #defi ...

  6. 2019.02.21 bzoj2829: 信用卡凸包(凸包)

    传送门 题意:给nnn个A∗BA*BA∗B的矩形,其中每个矩形的四个角被改造成了半径为rrr的四分之一 圆,问这些矩形的凸包周长. 思路:考虑求出圆心的凸包周长然后加上一个整圆的周长,证明很简单,略掉 ...

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

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

  8. 2019.02.21 bzo1038: [ZJOI2008]瞭望塔(半平面交)

    传送门 题意:给出一个nnn个点的轮廓,要求找一个高度最小的点使得它能够看见所有拐点. 思路:之间建半平面交然后取半平面交上的每个交点和每个轮廓更新答案即可. 代码: #include<bits ...

  9. 2019.02.21 bzoj2739: 最远点(决策单调性+分治)

    传送门 题意简述:给一个N个点的凸多边形,求离每一个点最远的点. 思路:先根据初中数学知识证明决策是满足单调性的,然后上分治优化即可. 才不是因为博主懒得写二分+栈优化呢 代码: #include&l ...

随机推荐

  1. gradle重复依赖终极方案解决办法

    buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build: ...

  2. 使用RecyclerView实现聊天界面

    原文地址:https://blog.csdn.net/wang_wy/article/details/79032698

  3. Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication

    Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication Overview Galera Cluster 由 Coders ...

  4. windows:plsql配置oracle连接

    1.plsql安装 此处省略,后续添加 2.plsql连接oracle: (1) 下载Instant client:http://www.oracle.com/technetwork/cn/topic ...

  5. springMVC自定义全局异常

    SpringMVC通过HandlerExceptionResolver处理程序异常,包括Handler映射,数据绑定以及目标方法执行时所发生的异常. SpringMVC中默认是没有加装载Handler ...

  6. 联想电脑t450,t460p,t470等安装好ubuntu后启动找不到系统

    其实我是这样解决的: 进入bios: 关quick start 关security 然后reboot就可以了

  7. pycharm 下使用tensorflow 之环境配置

    我们常常看代码使用ide里面看,而且还可以看到调试信息(虽然tensorflow有专门的调试介绍哈) 但是,常常代码在终端里面执行可以直接执行,但是到pycharm里面就会出现各种问题,常见的就是找不 ...

  8. oracle数据库分组之后取最大或者最小值

    原始数据 --使用子查询 SELECT * FROM student s WHERE s.birthday IN (SELECT MIN(s2.birthday) FROM student s2 GR ...

  9. win7 win10下80端口被System进程占用的解决方法

    用如下方法可以解决System进程占用80端口的问题:打开RegEdit:开始-运行-输入regedit-调出注册表找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl ...

  10. 微信小程序记账本进度一

    一,1.注册微信公众号 2.点击“立即注册”后,点击“”小程序“” 3.填写邮箱等信息.完成并激活.