BZOJ 5317: [Jsoi2018]部落战争
写出式子,若存在 $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]部落战争的更多相关文章
- 【BZOJ5317】[JSOI2018]部落战争(凸包,闵可夫斯基和)
[BZOJ5317][JSOI2018]部落战争(凸包,闵可夫斯基和) 题面 BZOJ 洛谷 题解 很明显我们只需要两个凸包\(A,B\). 假设询问给定的方向向量是\(v\). 那么现在就是判断\( ...
- 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部落战争(凸包)
即询问凸包是否有交.这显然可以直接求半平面交,但是复杂度O(q(n+m)),且没有什么优化空间. 更直接地表示,即相当于询问是否存在点a∈A,b∈B,使得a+d=b.移项,得到d=b-a.可以发现等式 ...
- [BZOJ5317][JSOI2018]部落战争(闵可夫斯基和)
对于点集$A$,$B$,闵可夫斯基和$C=\{(x1+x2,y1+y2)|(x1,x2)\in A,(y1,y2)\in B\}$.由此可知,对于两个凸包$A$,$B$的闵可夫斯基和$C$满足,$C$ ...
- BZOJ 2150: 部落战争 最大流
2150: 部落战争 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- BZOJ2150: 部落战争
题解: 把每个点拆成入点和出点,因为必须经过一次且只能经过一次.所以在两个点之间连一条上界=下界=1的边. 然后再s到每个入点连边,每个出点向t连边,点与点之间... 求最小流就可以过了... (感觉 ...
- BZOJ-2150部落战争(最小路径覆盖)
2150: 部落战争 Time Limit: 10 Sec Memory Limit: 259 MB Description lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国 ...
- 「JSOI2018」战争
「JSOI2018」战争 解题思路 我们需要每次求给一个凸包加上一个向量后是否与另外一个凸包相交,也就是说是否存在 \[ b\in B,(b+w)\in A \] 这里 \(A, B\) 表示凸包内部 ...
- 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】
P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...
随机推荐
- Linux入门培训教程 常见linux命令释义
快到中午吃饭了,然后忽然想起来samba里面没有添加用户.于是乎,就玩弄起了samba. Samba三下五除二就安装好了,想想window里面不断的点击下一步,还要小心提防各种隐藏再角落里的绑定软件. ...
- sh_03_程序计数
sh_03_程序计数 # 打印 5 遍 Hello Python # 1. 定义一个整数变量,记录循环次数 i = 0 # 2. 开始循环 while i < 3: # 1> 希望在循环内 ...
- Springboot入门:
Springboot入门: 1.springboot是基于spring的全新框架,设计目的:简化spring应用配置和开发过程. 该框架遵循“约定大于配置”原则,采用特定的方式进行配置,从而事开发者无 ...
- substring()方法是如何工作
1.substring()方法做了什么? substring(beginIndex,endIndex)方法返回一个从beginIndex到endIndex-1的字符串 String x = " ...
- 通过jvm 查看死锁
jstack -l jvm_pid 运行以下代码之后运行上面命令,可以在控制台上看到死锁. public class DeadLock { public static String obj1 = &q ...
- 线下作业MySQL #20175201
1.下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECDB,导入world.sql,提交导入成功截图 2.编 ...
- Xcode升级10.3后XIB文件报错
Xcode升级10.3后XiB文件包错,提示: Failed to find or create execution context for description '<IBCocoaTouch ...
- 常见iPhone设备尺寸及分辨率(持续更新)
开发中常用的px与pt区别 px就是表示pixel,像素,是屏幕上显示数据的最基本的点: pt就是point,是印刷行业常用单位,等于1/72英寸. px全称为pixel,是一个点,它不是自然界的长度 ...
- 【mysql】时间类型-如何根据不同的应用场景,选择合适的时间类型?
首先理解mysql时间存储类型,与使用场景 一些帮助理解的资料: 摘自:MySQL如何存储时间datetime还是timestamp MySql中关于日期的类型有Date/Datetime/Times ...
- Navicat12 for Mysql破解教程
1. 注册机和Navicat网盘下载地址 链接:https://pan.baidu.com/s/1taWdnaLCPIu8xmNm1uV-Ng 提取码:no8l 2. 请先安装navicat for ...