传送门

题意: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. django的forms认证组件

    django的forms认证组件 每个网站的注册界面都需要有相应的"认证"功能,比如说认证注册页面的用户名是否已被注册,二次输入的密码是否一致以及认证用户输入的用户名.邮箱.手机号 ...

  2. [UE4]Size Box

    一.Size Box用来指定一个特定的尺寸 二.Size Box只能放一个子控件 三.Size Box一般作为Canvas Panel的子控件,并勾选Size To Content选项,而不作为根节点 ...

  3. systemverilog的高亮显示

    1. 在_vimrc文件末尾添加: syntax on "确定vim打开语法高亮 filetype on "打开文件类型检测 filetype plugin on "为特 ...

  4. 采用link方式解决zabbix对于备份监控和ORACLE日志监控由于路径不统一的问题

    #对于备份监控和ORACLE日志监控由于路径不统一,我们可以采用link的方式如:#ln -s 原路径 新路径(/zabbix/logs)#新路径统一放在/zabbix/logs下具体看模板指定. # ...

  5. centos 支持安装libsodium

    yum install epel-release -y yum install libsodium -y 然后没了.

  6. 一些恶作剧的vbs程序代码

    恶作剧的vbs代码,这里提供的都是一些死循环或导致系统死机的vbs对机器没坏处,最多关机重启一下就可以了,将下面的任意一段代码保存为*.vbs即可 循环弹窗: do msgbox "hi&q ...

  7. day31网络编程

    网络编程1. 目标:编写一个C/S架构的软件    C/S: Client(用户端)--------基于网络----------Server(服务端)    B/S: Browser-------基于 ...

  8. C#设计模式(3)——工厂方法模式(Factory Method)

    在简单工厂模式中通过工厂Factory获取不同的对象,但是有一个明显的缺点——简单工厂模式系统难以扩展! 一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂, 可以通过工厂 ...

  9. Halcon旋转图片的研究

    在Halcon中有两个用于图像旋转的函数: 1,rotate_image *Image和ImageRotate分别是输入和输出图像 *Phi是输入的旋转度数 *interpolation是内插方式,默 ...

  10. 记录: Android测试网速实现

    2.3开始android提供了一个流量统计类, android.net.TrafficStats,通过使用这个类提供的方法,就可以获取设备流量.下面为该类中的常用方法,欢迎大家完善补充 static ...