首先可以题目描述的两个点集是两个凸包,分别设为A和B。

考虑一个向量w不合法的条件。

即存在b+w=a,其中a属于A,b属于B。

也就是a-b=w。

即对b取反后和a的闵可夫斯基和。

求出闵可夫斯基和后check点是否在凸包内即可,在凸包内说明不合法。

#include<iostream>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#define N 330000
#define L 300000
#define eps 1e-15
#define inf 1e18+7
#define db double
#define ll long long
#define ldb long double
using namespace std;
inline int read()
{
char ch=0;
int x=0,flag=1;
while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*flag;
}
int dcmp(db x){if(fabs(x)<=eps)return 0;else return (x>0)?+1:-1;}
struct vec
{
db x,y;
vec operator+(vec a){return (vec){x+a.x,y+a.y};}
vec operator-(vec a){return (vec){x-a.x,y-a.y};}
db ang(){return atan2(y,x);}
};
typedef vec pot;
db cross(vec a,vec b){return a.x*b.y-b.x*a.y;}
bool cmp_vec(vec a,vec b){return a.ang()<b.ang();}
bool cmp_pot(pot a,pot b){if(dcmp(a.x-b.x))return a.x<b.x;else return a.y<b.y;}
vec f[N];
pot a[N],b[N],p[N],t[N],v[N],s[N];
int main()
{
int n=read(),m=read(),qnum=read(),top,num,num_,cnt=0,tot=0;
pot P={-inf,-inf},Q={-inf,-inf};
for(int i=1;i<=n;i++)a[i].x=+read(),a[i].y=+read();
num=0;sort(a+1,a+n+1,cmp_pot);top=0;
for(int i=1;i<=n;i++)
{
while(top>1&&dcmp(cross(s[top]-s[top-1],a[i]-s[top-1]))!=+1)top--;
s[++top]=a[i];
}
for(int i=1;i<=top;i++)t[++num]=s[i];top=0;
for(int i=1;i<=n;i++)
{
while(top>1&&dcmp(cross(s[top]-s[top-1],a[i]-s[top-1]))!=-1)top--;
s[++top]=a[i];
}
for(int i=top;i>=1;i--)t[++num]=s[i];num_=0;
for(int i=1;i<=num;i++)
{
if(i==num&&!dcmp(t[i].x-t[1].x)&&!dcmp(t[i].y-t[1].y))continue;
if(i!=1&&!dcmp(t[i].x-t[i-1].x)&&!dcmp(t[i].y-t[i-1].y))continue;
v[++num_]=t[i];
}
for(int i=1;i<=num_;i++)
{
if(dcmp(v[i].y-P.y)==0&&dcmp(v[i].x-P.x)<0)P=v[i];
if(dcmp(v[i].y-P.y)>0)P=v[i];
if(i!=1)f[++cnt]=v[i]-v[i-1];if(i==num_)f[++cnt]=v[1]-v[i];
} for(int i=1;i<=m;i++)b[i].x=-read(),b[i].y=-read();
num=0;sort(b+1,b+m+1,cmp_pot);top=0;
for(int i=1;i<=m;i++)
{
while(top>1&&dcmp(cross(s[top]-s[top-1],b[i]-s[top-1]))!=+1)top--;
s[++top]=b[i];
}
for(int i=1;i<=top;i++)t[++num]=s[i];top=0;
for(int i=1;i<=m;i++)
{
while(top>1&&dcmp(cross(s[top]-s[top-1],b[i]-s[top-1]))!=-1)top--;
s[++top]=b[i];
}
for(int i=top;i>=1;i--)t[++num]=s[i];num_=0;
for(int i=1;i<=num;i++)
{
if(i==num&&!dcmp(t[i].x-t[1].x)&&!dcmp(t[i].y-t[1].y))continue;
if(i!=1&&!dcmp(t[i].x-t[i-1].x)&&!dcmp(t[i].y-t[i-1].y))continue;
v[++num_]=t[i];
}
for(int i=1;i<=num_;i++)
{
if(dcmp(v[i].y-Q.y)==0&&dcmp(v[i].x-Q.x)<0)Q=v[i];
if(dcmp(v[i].y-Q.y)>0)Q=v[i];
if(i!=1)f[++cnt]=v[i]-v[i-1];if(i==num_)f[++cnt]=v[1]-v[i];
} sort(f+1,f+cnt+1,cmp_vec);
pot k=P+Q;p[++tot]=k;
for(int i=1;i<=cnt;i++)
{
k=k+f[i];
if(i!=cnt&&dcmp(f[i].x*f[i+1].y-f[i].y*f[i+1].x)==0)continue;
p[++tot]=k;
}
tot--;k=p[1];
for(int i=1;i<=qnum;i++)
{
pot o;
o.x=read();o.y=read();
if(dcmp(cross(p[2]-k,o-k))==-1||dcmp(cross(p[tot]-k,o-k))==+1){printf("0\n");continue;}
int l=2,r=tot-1,mid;
while(l<r)
{
mid=((l+r)>>1)+1;
if(dcmp(cross(p[mid]-k,o-k))==+1)l=mid;
else r=mid-1;
}
if(dcmp(cross(p[l+1]-p[l],o-p[l]))!=-1)printf("1\n");else printf("0\n");
}
return 0;
}

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

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

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

  2. [JSOI2018]战争

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

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

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

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

    SQLite数据库的特性 特点: 1.轻量级2.独立性,没有依赖,无需安装3.隔离性 全部在一个文件夹系统4.跨平台 支持众多操作系统5.多语言接口 支持众多编程语言6.安全性 事物,通过独占性和共享 ...

  2. IPVS负载均衡

    概念: ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的4层LAN交换,作为 Linux 内核的一部分.ipvs运行在主机上,在真实服务器集群前充当负载均衡器. ...

  3. Javascript 日期格式化 相关操作

    1.相关扩展函数 //--------------------------------------------------- // 判断闰年 //--------------------------- ...

  4. 关于C++中的friend友元函数的总结

    1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数. ...

  5. http协议的状态码解释

    一些常见的状态码为: 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务器超时 下面提供 HTTP 状态码的完整列表.点击链接可了解详情.您也可以访问 HTTP 状态码上的 ...

  6. java static方法不能被重写@Override

    重写方法的目的是为了多态,或者说:重写是实现多态的前提,即重写是发生在继承中且是针对非static方法的. 语法上子类允许出现和父类只有方法体不一样其他都一模一样的static方法,但是在父类引用指向 ...

  7. L2-021 点赞狂魔

    会set的基础用法就可以A了,虽然是L2题,但是不难,代码如下,很好理解,set在这里不解释了自己去网上查一下就明白了: #include<stdio.h> #include<str ...

  8. MVC路由 路由的三种扩展 替换MVC内置的Handler

    Global.asax 是 程序入口文件 路由配置   为什么localhost:8088/Home/Index/1 能返问到我们写的 会去掉前缀跟端口号  变成Home/Index/1 用这个跟路由 ...

  9. 网页常见单位: px em pt % rem vw、vh、vmin、vmax , rem 使用

    1.网页常见单位:  px  em  pt    vw\vh   rem 1.1 px单位名称为像素,相对长度单位,像素(px)是相对于显示器屏幕分辨率而言  (最终解析单位) em单位名称为相对长度 ...

  10. mysql 安装成功以及第一次安装成功初始化密码操作

    一 把文件解压到一个目录下 这是解压后的目录 将my.ini文件考进去 双击打开my.ini 找到这两行更改成自己的解压路径保存 右键此电脑属性 找到高级系统设置配置环境变量 环境变量   新建 变量 ...