[JSOI2018]战争
题目描述
九条可怜是一个热爱读书的女孩子。
在她最近正在读的一本小说中,描述了两个敌对部落之间的故事。第一个部落有 nnn 个人,第二个部落有 mmm 个人,每一个人的位置可以抽象成二维平面上坐标为 (xi,yi)(x_i,y_i)(xi,yi) 的点。
在这本书中,人们有很强的领地意识,对于平面上的任何一个点,如果它被三个来自同一部落的人形成的三角形(可能退化成一条线段)包含(包括边界),那么这一个点就属于这一个部落的领地。如果存在一个点同时在两个阵营的领地中,那么这两个部落就会为了争夺这一个点而发生战争。
常年的征战让两个部落不堪重负,因此第二个部落的族长作出了一个英明的决定,他打算选择一个向量 (dx,dy)(dx,dy)(dx,dy) ,让所有的族人都迁徙这个向量的距离,即所有第二阵营的人的坐标都变成 (xi+dx,yi+dy)(x_i+dx,y_i+dy)(xi+dx,yi+dy) 。
现在他计划了 qqq 个迁徙的备选方案,他想要你来帮忙对每一个迁徙方案,计算一下在完成了迁徙之后,两个部落之间还会不会因为争夺领地而发生战争。
输入格式
第一行输入三个整数 n,m,qn,m,qn,m,q,表示两个部落里的人数以及迁徙的备选方案数。
接下来 nnn 行每行两个整数 xi,yix_i,y_ixi,yi 表示第一个部落里的人的坐标。
接下来 mmm 行每行两个整数 xi,yix_i,y_ixi,yi 表示第二个部落里的人的坐标。
接下来 qqq 行每行两个整数 dxi,dyidx_i,dy_idxi,dyi 表示一个迁徙方案。
输入数据保证所有人的坐标两两不同。
输出格式
对于每个迁徙方案,输出一行一个整数,000 表示不会发生冲突,111 表示会发生冲突。
输入输出样例
4 4 3
0 0
1 0
0 1
1 1
-1 0
0 3
0 2
0 -1
0 0
2 3
0 -1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lol;
struct Node
{
lol x,y;
Node operator + (const Node &b) const
{
return (Node){x+b.x,y+b.y};
}
Node operator - (const Node &b) const
{
return (Node){x-b.x,y-b.y};
}
}a[],b[],sa[],sb[],sta[],bs,s1[],s2[],s[];
int n,m,q,top;
bool cmp(Node a,Node b)
{
if (a.y==b.y) return a.x<b.x;
return a.y<b.y;
}
lol cross(Node a,Node b)
{
return (a.x*b.y-a.y*b.x);
}
lol dist(Node a)
{
return a.x*a.x+a.y*a.y;
}
bool cmp1(Node A,Node B)
{
lol t=cross((a[]-A),(a[]-B));
if (t==) return dist(a[]-A)<dist(a[]-B);
return t>;
}
bool cmp2(Node A,Node B)
{
lol t=cross((b[]-A),(b[]-B));
if (t==) return dist(b[]-A)<dist(b[]-B);
return t>;
}
int grahama(int N)
{int i;
sort(a+,a+N+,cmp);
sort(a+,a+N+,cmp1);
top=;
sa[++top]=a[];
if (N==) return ;
sa[++top]=a[];
for (i=;i<=N;i++)
{
while (top>&&cross(a[i]-sa[top-],sa[top]-sa[top-])>=) top--;
top++;
sa[top]=a[i];
}
sa[top+]=a[];
return top;
}
int grahamb(int N)
{int i;
sort(b+,b+N+,cmp);
sort(b+,b+N+,cmp2);
top=;
sb[++top]=b[];
if (N==) return ;
sb[++top]=b[];
for (i=;i<=N;i++)
{
while (top>&&cross(b[i]-sb[top-],sb[top]-sb[top-])>=) top--;
top++;
sb[top]=b[i];
}
sb[top+]=b[];
return top;
}
bool cmpp(Node A,Node B)
{
lol t=cross((s[]-A),(s[]-B));
if (t==) return dist(s[]-A)<dist(s[]-B);
return t>;
}
int grahams(int N)
{int i;
sort(s+,s+N+,cmp);
sort(s+,s+N+,cmpp);
top=;
sta[++top]=s[];
if (N==) return ;
sta[++top]=s[];
for (i=;i<=N;i++)
{
while (top>&&cross(s[i]-sta[top-],sta[top]-sta[top-])>=) top--;
top++;
sta[top]=s[i];
}
sta[top+]=s[];
return top;
}
bool cmp3(Node A,Node B)
{
return cross(A,B)>||(cross(A,B)==&&dist(A)<dist(B));
}
lol find(Node A)
{
if(cross(A,sta[])>||cross(sta[top],A)>) return ;
lol ps=lower_bound(sta+,sta+top+,A,cmp3)-sta-;
return cross((A-sta[ps]),(sta[ps%top+]-sta[ps]))<=;
}
void Minkowski()
{
for(lol i=;i<n;i++) s1[i]=sa[i+]-sa[i];s1[n]=sa[]-sa[n];
for(lol i=;i<m;i++) s2[i]=sb[i+]-sb[i];s2[m]=sb[]-sb[m];
top=;
s[top]=sa[]+sb[];
lol i=,j=;
while(i<=n&&j<=m) ++top,s[top]=s[top-]+(cross(s1[i],s2[j])>=?s1[i++]:s2[j++]);
while(i<=n) ++top,s[top]=s[top-]+s1[i++];
while(j<=m) ++top,s[top]=s[top-]+s2[j++];
}
int main()
{int i,j;
lol dx,dy;
cin>>n>>m>>q;
for (i=;i<=n;i++)
scanf("%lld%lld",&a[i].x,&a[i].y);
for (i=;i<=m;i++)
scanf("%lld%lld",&b[i].x,&b[i].y),b[i].x=-b[i].x,b[i].y=-b[i].y;
n=grahama(n);
m=grahamb(m);
Minkowski();
top=grahams(top);
bs=sta[];
for (i=;i<=top;i++)
sta[i]=sta[i]-bs; for (i=;i<=q;i++)
{
scanf("%lld%lld",&dx,&dy);
if (find((Node){dx,dy}-bs))
printf("1\n");
else printf("0\n");
}
}
[JSOI2018]战争的更多相关文章
- P4557 [JSOI2018]战争
首先可以题目描述的两个点集是两个凸包,分别设为A和B. 考虑一个向量w不合法的条件. 即存在b+w=a,其中a属于A,b属于B. 也就是a-b=w. 即对b取反后和a的闵可夫斯基和. 求出闵可夫斯基和 ...
- BZOJ5317:[JSOI2018]战争(闵可夫斯基和)
令 \(a\in A,b\in B\) 则移动向量 \(\omega\) 使得存在 \(b+\omega=a\) 那么 \(\omega\) 需要满足 \(\omega=a−b\) 黑科技:闵可夫斯基 ...
- 洛谷P4557 [JSOI2018]战争(闵可夫斯基和+凸包)
题面 传送门 题解 看出这是个闵可夫斯基和了然而我当初因为见到这词汇是在\(shadowice\)巨巨的\(Ynoi\)题解里所以压根没敢学-- 首先您需要知道这个 首先如果有一个向量\(w\)使得\ ...
- [JSOI2018]战争(闵可夫斯基和)
害怕,可怜几何题 果然不会 题目就是说给你两个凸包,每次询问给你一个向量 \(c\) 问你能不能从两个凸包 \(A\) , \(B\) 里分别找到一个点 \(a\) , \(b\) 满足 \(a+c= ...
- 【LuoguP4557】[JSOI2018]战争
题目链接 题意 给你两个点集. q次询问 , 每次把其中一个点集往一个方向移动 , 问两个点集的凸包还有没有交. Sol 闵可夫斯基和板子题. 把问题做如下转换: 我们本来两个凸包相交是相当于是对于移 ...
- 计算几何细节梳理&模板
点击%XZY巨佬 向量的板子 #include<bits/stdc++.h> #define I inline using namespace std; typedef double DB ...
- HHHOJ #151. 「NOI模拟 #2」Nagisa
计算几何板子题(我才没有拷板子的说--) 众所周知,三角形的重心坐标是\((\frac{x_1+x_2+x_3}{3},\frac{y_1+y_2+y_3}{3})\) 然后我们发现如果我们有一个点集 ...
- 【学习笔记】Minkowski和
这还是个被我咕了N久的玩意 Minkowski和是一个奇怪的玩意 他长这样 $S={a+b \| a \in A , b \in B}$ AB可以是点集也可是向量集(显然) 他可以处理一些奇怪的东西 ...
- JSOI部分题解
JSOI部分题解 JSOI2018 战争 问题转化为给定你两个凸包\(\mathbb S,\mathbb T\),每次独立的询问将\(\mathbb T\)中的每个点移动一个向量,问\(\mathbb ...
随机推荐
- 基于travis和git tag 实现npm自动化发版
最近又把烂尾的开源项目alfred-femine拾起来了,这个项目旨在开发一系列前端常用的alfred workflow,提供前端开发的查询效率.时隔这么久,再次搞起,希望自己能够一直维护下去,也欢迎 ...
- Linux下创建Oracle19C的数据库实例
接上一篇博客,安装 Oracle19chttps://www.cnblogs.com/xuzhaoyang/p/11264557.html 切换到root用户下,切换目录到db_1,执行,遇到选择路径 ...
- Linux04 目录的相关操作(mkdir、rmdir、rm、cp)
一.创建目录:mkdir mkdir 目录名 二.删除目录:rmdir / rm rmdir 目录名 rm -r 目录名 每一级子目录都会询问是否删除 rm -rf 目录名 慎用,给 ...
- Python脚本-自动下载安装
#coding=utf-8 import os import sys if os.getuid() == 0: pass else: print 'no' sys.exit(1) version = ...
- Linux的软连接、硬链接和find命令
软链接和硬链接 序号 命令 作用 01 ln –s 被链接的源文件 链接文件 建立文件的软连接,用通俗的是方式类似于Windows下的快捷链接 源文件连接要是有绝对路径,不能使用相对路径,这样可以方便 ...
- Go语言( 流程控制)
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”. Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码.降低重复代码而生的结 ...
- gentoo emerge简单用法
包管理工具 包的命名 gentoo中每个包名包含两部分,组名与包名,如:dev-db/redis,dev-db是组名,redis是包名或者称库名. 安装搜索时需要指定包的名称,一般不需要输入组名, 但 ...
- leetcode整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321 示例 3: 输入: 120输出: 21 ...
- 5. JDBC/ODBC服务器
Spark SQL也提供JDBC连接支持,这对于让商业智能(BI)工具连接到Spark集群上以及在多用户间共享一个集群的场景都非常有用.JDBC服务器作为一个独立的Spark驱动器程序运行,可以在多用 ...
- Springboot 结合百度IORC实现自定义模板图片识别
前言: 首先呢,最近再公司的项目当中遇到这样的一个问题,就是需要识别图片,提取图片当中的关键语句,而且识别的语句当然是人家手写体识别,翻来覆去一想,最终还是决定使用百度的OCR帮助我解决这一项需求 话 ...