BZOJ5317 JSOI2018部落战争(凸包)
即询问凸包是否有交。这显然可以直接求半平面交,但是复杂度O(q(n+m)),且没有什么优化空间。
更直接地表示,即相当于询问是否存在点a∈A,b∈B,使得a+d=b。移项,得到d=b-a。可以发现等式右边是一个闵可夫斯基和。求闵可夫斯基和只需要分别求出两个凸包,然后每次考虑ai+1+bi和ai+bi+1哪个将作为凸包中下一个点。将其求出后,只需要判断点是否在凸包内。二分找到上下边界即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cassert>
using namespace std;
#define ll long long
#define vector point
#define N 200010
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,q;
const double eps=1E-;
struct point
{
int x,y;
vector operator +(const vector&a) const
{
return (vector){x+a.x,y+a.y};
}
vector operator -(const vector&a) const
{
return (vector){x-a.x,y-a.y};
}
ll operator *(const vector&a) const
{
return 1ll*x*a.y-1ll*y*a.x;
}
bool operator <(const point&a) const
{
return x<a.x||x==a.x&&y<a.y;
}
}a[N],b[N],c[N],d[N],e[N],f[N];
struct line
{
point a;vector p;
double f(int x){return a.y+(double)(x-a.x)/p.x*p.y;}
};
void makehull(point *hull,point *a,int &n)
{
sort(a+,a+n+);hull[]=a[];
int m=;
for (int i=;i<=n;i++)
{
while (m>&&(a[i]-hull[m-])*(hull[m]-hull[m-])>) m--;
hull[++m]=a[i];
}
for (int i=n-;i>=;i--)
{
while (m>&&(a[i]-hull[m-])*(hull[m]-hull[m-])>) m--;
hull[++m]=a[i];
}
n=m;
}
void merge(point *up,point *down,point *a,point *b,int &n,int &m)
{
int p=,u=,v=;up[]=a[]+b[];
while (u<n||v<m)
{
if (u==n) v++;
else if (v==m) u++;
else if ((a[u+]+b[v]-up[p])*(a[u]+b[v+]-up[p])>) u++;else v++;
while (p>&&(a[u]+b[v]-up[p-])*(up[p]-up[p-])>) p--;
up[++p]=a[u]+b[v];
}
for (int i=;i<=p;i++) if (up[i].x>up[i+].x) {n=i;break;}
for (int i=n;i<=p;i++) down[i-n+]=up[i];m=p-n+;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj5317.in","r",stdin);
freopen("bzoj5317.out","w",stdout);
#endif
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();
makehull(c,a,n),makehull(d,b,m);
merge(e,f,c,d,n,m);reverse(f+,f+m+);
for (int i=;i<=q;i++)
{
int x=read(),y=read();
int u=lower_bound(e+,e+n+,(point){x,y})-e;
if (u==||u==n+||(line){e[u-],e[u]-e[u-]}.f(x)-eps>y) {printf("0\n");continue;}
u=lower_bound(f+,f+m+,(point){x,y})-f;
if (u==||u==m+||(line){f[u-],f[u]-f[u-]}.f(x)+eps<y) {printf("0\n");continue;}
printf("1\n");
}
return ;
}
BZOJ5317 JSOI2018部落战争(凸包)的更多相关文章
- 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 ...
- [BZOJ5317][JSOI2018]部落战争(闵可夫斯基和)
对于点集$A$,$B$,闵可夫斯基和$C=\{(x1+x2,y1+y2)|(x1,x2)\in A,(y1,y2)\in B\}$.由此可知,对于两个凸包$A$,$B$的闵可夫斯基和$C$满足,$C$ ...
- 【BZOJ5317】[JSOI2018]部落战争(凸包,闵可夫斯基和)
[BZOJ5317][JSOI2018]部落战争(凸包,闵可夫斯基和) 题面 BZOJ 洛谷 题解 很明显我们只需要两个凸包\(A,B\). 假设询问给定的方向向量是\(v\). 那么现在就是判断\( ...
- BZOJ 5317: [Jsoi2018]部落战争
传送门 写出式子,若存在 $a \in A$,$b \in B$,使得 $b+v=a$,那么此方案会产生冲突 即存在 $a \in A$,$b \in B$,使得 $v=a+(-b)$,设 $C=A+ ...
- 「JSOI2018」战争
「JSOI2018」战争 解题思路 我们需要每次求给一个凸包加上一个向量后是否与另外一个凸包相交,也就是说是否存在 \[ b\in B,(b+w)\in A \] 这里 \(A, B\) 表示凸包内部 ...
- BZOJ2150: 部落战争
题解: 把每个点拆成入点和出点,因为必须经过一次且只能经过一次.所以在两个点之间连一条上界=下界=1的边. 然后再s到每个入点连边,每个出点向t连边,点与点之间... 求最小流就可以过了... (感觉 ...
- BZOJ 2150: 部落战争 最大流
2150: 部落战争 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- BZOJ-2150部落战争(最小路径覆盖)
2150: 部落战争 Time Limit: 10 Sec Memory Limit: 259 MB Description lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国 ...
- 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】
P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...
随机推荐
- TerraGate软件安装后,不能启动的解决办法
在服务端安装Skyline的TerraGate软件的时候,大家可能会遇到过这样的问题,“TerraGate软件安装后,不能启动”,很多时候,这个问题是因为TerraGate设 置的端口号已经被占用造成 ...
- 浅谈Java泛型中的extends和super关键字
泛型是在Java 1.5中被加入了,这里不讨论泛型的细节问题,这个在Thinking in Java第四版中讲的非常清楚,这里要讲的是super和extends关键字,以及在使用这两个关键字的时候为什 ...
- Unity报错 GameObject is already being activated or deactivated
unity 在OnDisable 方法里设置父节点会报这个错. void OnDisable() { // transform.parent = oldParent; transform.SetPar ...
- odoo 装饰器用法@api
摘自:blog.csdn.net/cmzhuang/article/details/52932883 @api.one one装饰符自动遍历记录集,把self重新定义成当前记录.注意,返回值是一个li ...
- Luogu4099 HEOI2013 SAO 组合、树形DP
传送门 值得注意的是一般的DAG的拓扑序列数量是NP问题,所以不能直接入手 题目中给出的图可以看做是一个树形图,虽然方向比较迷.考虑使用树形图的性质 不妨任选一个点为根做树形DP,注意到数的位置与方案 ...
- WPF 实现主从的datagrid以及操作rowdetailtemplate 的方法
原文:WPF 实现主从的datagrid以及操作rowdetailtemplate 的方法 WPF 实现主从的datagrid以及操作rowdetailtemplate 的方法 最近在做 ...
- 认识Python&基础环境搭建
前言 作为.NET Coder可能.NET Core是现阶段首要学习方向,但是说实在的对Core真的不感冒. 原因有几点: 1.公司项目底层需要的一部分库,Core还不支持. 2.同样的需求,.NET ...
- Oracle_忘记密码
1.运行到C盘根目录 2.输入:SET ORACLE_SID = 你的SID名称 3.输入:sqlplus/nolog 4.输入:connect/as sysdba 5.输入:altre user s ...
- 如何设置本机电脑的固定IP地址?
最近使用Loadrunner需要用到IP欺骗,但是我打开设置IP欺骗却提示我:IP向导不支持启用DHCP的网卡.您的卡启用了DHCP或者配置了无效设置.请与系统管理员联系. 我就方了,于是百度了一下, ...
- Mysql基于GTID复制模式-运维小结 (完整篇)
先来看mysql5.6主从同步操作时遇到的一个报错:mysql> change master to master_host='192.168.10.59',master_user='repli' ...