LGP4577【JSOI2018】战争


题解:
- 求出$A$ 和$-B$ 的$Minkowsiki$和再$O(logn)$判断一个点是否在凸包内;
- $Minkowsiki$的求法比较容易忘,要多多温习才可以;
#include<bits/stdc++.h>
#define ld long long
using namespace std;
const int N=;
int n,m,q;
struct P{
ld x,y;
P(ld _x=,ld _y=):x(_x),y(_y){};
bool operator <(const P&a)const{return x==a.x?y<a.y:x<a.x;}
P operator -(const P&a)const{return P(x-a.x,y-a.y);}
P operator +(const P&a)const{return P(x+a.x,y+a.y);}
}p1[N],p2[N],ch[N],p[N<<],Q;
ld crs(P a,P b){return a.x*b.y-a.y*b.x;}
ld len(P a){return a.x*a.x+a.y*a.y;}
bool cmpQ(P a,P b){return crs(a,b)>||(crs(a,b)==&&len(a)<len(b));}
char gc(){
static char*P1,*P2,s[];
if(P1==P2)P2=(P1=s)+fread(s,,,stdin);
return(P1==P2)?EOF:*P1++;
}
int rd(){
int x=,f=;char c=gc();
while(c<''||c>''){if(c=='-')f=-;c=gc();}
while(c>=''&&c<=''){x=x*+c-'';c=gc();}
return x*f;
}
void convex(P *p,int&cnt){
sort(p+,p+cnt+);
int top,tmp;
ch[top=]=p[];
for(int i=;i<=cnt;++i){
while(top>&&crs(ch[top]-ch[top-],p[i]-ch[top])<=)top--;
ch[++top]=p[i];
}
tmp=top;
for(int i=cnt-;i;--i){
while(top>tmp&&crs(ch[top]-ch[top-],p[i]-ch[top])<=)top--;
ch[++top]=p[i];
}
for(int i=;i<=top;++i)p[i]=ch[i];
cnt=--top;
}
bool check(P Q){
if(crs(p[],Q)<||crs(p[n],Q)>)return false;
int pos=lower_bound(p+,p+n+,Q,cmpQ)-p-;
return crs(p[pos+]-p[pos],Q-p[pos])>=;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("war.in","r",stdin);
freopen("war.out","w",stdout);
#endif
n=rd();m=rd();q=rd();
for(int i=;i<=n;++i)p1[i].x=rd(),p1[i].y=rd();
for(int i=;i<=m;++i)p2[i].x=-rd(),p2[i].y=-rd();
convex(p1,n),convex(p2,m);
int cnt=,j=;
p1[n+]=p1[];p2[m+]=p2[];
for(int i=;i<=n;++i){
p[++cnt]=p1[i]+p2[j];
while(j<=m&&crs(p2[j+]-p2[j],p1[i+]-p1[i])>=)
p[++cnt]=p1[i]+p2[++j];
}
while(j<=m)p[++cnt]=p1[]+p2[j++];
n=cnt;for(int i=;i<=n;++i)p[i]=p[i]-p[];
for(int i=;i<=q;++i){
Q.x=rd(),Q.y=rd();
printf("%d\n",check(Q-p[]));
}
return ;
}
LGP4577【JSOI2018】战争的更多相关文章
- [JSOI2018]战争
题目描述 九条可怜是一个热爱读书的女孩子. 在她最近正在读的一本小说中,描述了两个敌对部落之间的故事.第一个部落有 nnn 个人,第二个部落有 mmm 个人,每一个人的位置可以抽象成二维平面上坐标为 ...
- 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 ...
随机推荐
- smash:一个类unix内核
前言 每一个蹩脚的C++程序员都有一颗做操作系统内核的心.我从大学毕业开始就对操作系统内核感兴趣,将其看作是术之尽头,可惜那时候一直在无忧无虑的忙着玩网游,也就搁置了.随着时间的推移,逐渐就将其淡忘了 ...
- Linux-C语言标准输入输出
标准 I/O 库(stdio)及其头文件 stdio.h 为底层 I/O 系统调用提供了一个通用的接口.这个库现在已经成为 ANSI 标准 C 的一部分.标准 I/O 库提供了许多复杂的函数用于格式化 ...
- printf命令详解
基础命令学习目录首页 本文是Linux Shell系列教程的第(八)篇,更多shell教程请看:Linux Shell系列教程 在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中 ...
- Django之Form
目录 一.说明 二.参数说明 三.自定义验证规则 四.实例 一.说明 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数 ...
- Java-URLEncoder.encode 什么时候才是必须的
当你希望把一段 URL 当成另一个 URL 的参数时,比如:当用户点击交易的按钮时你发现未登录就跳转到 login 页面同时带上一个参数记录在登录之前用户是希望访问的那个交易页面,这样在登录完成之后再 ...
- CF 1095C Powers Of Two(二进制拆分)
A positive integer xx is called a power of two if it can be represented as x=2y, where y is a non-ne ...
- MathExam6378
我的第一个程序 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 15 10 • Estima ...
- Unity发布Exe后,去掉提示分辨率的窗口
Unity版本:2017.4 菜单File->Build Settings...,修改如下图的位置,将“Display Resolution Dialog”从Enabled改为Disabled
- keil c51笔记
第一章 Keil C51开发系统基本知识 第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性. ...
- rpm安装和二进制安装
rpm包安装 Tomcat RPM安装(先安装JDK + 再安装Tomcat) 1:升级系统自带的JDK(也可以使用oracle的JDK) yum install -y java-1.8.0-open ...
