洛谷P4557 [JSOI2018]战争(闵可夫斯基和+凸包)
题面
题解
看出这是个闵可夫斯基和了然而我当初因为见到这词汇是在\(shadowice\)巨巨的\(Ynoi\)题解里所以压根没敢学……
首先您需要知道这个
首先如果有一个向量\(w\)使得\(w+b=a\),也就是使\(A,B\)的凸包有交,有\(w=a-b\),那么我们把\(B\)的横坐标和纵坐标全部取反之后,\(w\)就必定在\(A\)和\(-B\)的闵可夫斯基和里
那么只要对\(A,-B\)求一个闵可夫斯基和的凸包就行了,然后判一下输入的向量是否在这个凸包里就行了
//minamoto
#include<bits/stdc++.h>
#define R register
#define inf 0x3f3f3f3f
#define ll long long
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21];int K=-1;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
const int N=2e5+5;
struct node{
int x,y;
node(){}
node(R int xx,R int yy):x(xx),y(yy){}
inline node operator +(const node &b)const{return node(x+b.x,y+b.y);}
inline node operator -(const node &b)const{return node(x-b.x,y-b.y);}
inline ll operator *(const node &b)const{return 1ll*x*b.y-1ll*y*b.x;}
inline bool operator <(const node &b)const{return x<b.x;}
inline ll norm(){return 1ll*x*x+1ll*y*y;}
}A[N],B[N],C[N],st[N],P;
int ta,tb,tc,n,m,k,top,dd,q,x,y;ll res;
inline bool cmp(const node &a,const node &b){
ll k=(a-P)*(b-P);
return k?(k>0?1:0):(a-P).norm()<(b-P).norm();
}
void Graham(node *A,int &ta){
P=node(inf,inf),k=0;
fp(i,1,ta)if(A[i].x<P.x||A[i].x==P.x&&A[i].y<P.y)P=A[i],k=i;
swap(A[1],A[k]),sort(A+2,A+1+ta,cmp);
st[0]=A[1],st[top=1]=A[2];
fp(i,3,ta){
while(top&&(A[i]-st[top-1])*(st[top]-st[top-1])>=0)--top;
st[++top]=A[i];
}
fp(i,0,top)A[i]=A[i+top+1]=st[i];
ta=top;
}
void merge(){
C[tc=1]=A[0]+B[0];
R int i=0,j=0;
while(i<=ta||j<=tb){
node p1=(A[i]+B[j+1])-C[tc],p2=(A[i+1]+B[j])-C[tc];
p1*p2>=0?(C[++tc]=A[i]+B[j+1],++j):(C[++tc]=A[i+1]+B[j],++i);
}
// for(;i<=ta;++i)C[++tc]=A[i]+B[j];
// for(;j<=tb;++j)C[++tc]=A[i]+B[j];
Graham(C,tc);
ta=0,tb=0,dd=0;
while(C[dd+1].x>C[dd].x)++dd;
fp(i,0,dd)A[++ta]=C[i];
while(C[dd+1].x>=C[dd].x)++dd;
++tc;while(C[tc-1].x==C[tc].x)--tc;
fd(i,tc,dd)B[++tb]=C[i],B[tb].y=-B[tb].y;
}
bool in(node *A,int tot,const node &P){
if(P.x<A[1].x||P.x>A[tot].x)return false;
int k=lower_bound(A+1,A+tot+1,P)-A;
if(A[k].x==P.x)return P.y>=A[k].y;
return (A[k]-P)*(A[k-1]-P)<=0;
}
inline bool ck(const R int &x,const R int &y){return in(A,ta,node(x,y))&&in(B,tb,node(x,-y));}
int main(){
// freopen("testdata.in","r",stdin);
// freopen("testdata.out","w",stdout);
n=read(),m=read(),q=read(),ta=n,tb=m;
fp(i,1,n)A[i].x=read(),A[i].y=read();
fp(i,1,m)B[i].x=-read(),B[i].y=-read();
Graham(A,ta),Graham(B,tb);
merge();
while(q--)x=read(),y=read(),sr[++K]=ck(x,y)?'1':'0',sr[++K]='\n';
return Ot(),0;
}
洛谷P4557 [JSOI2018]战争(闵可夫斯基和+凸包)的更多相关文章
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
- 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】
题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...
- 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\) 黑科技:闵可夫斯基 ...
- 洛谷P4724 【模板】三维凸包
题面 传送门 题解 先理一下关于立体几何的基本芝士好了--顺便全都是从\(xzy\)巨巨的博客上抄来的 加减 三维向量加减和二维向量一样 模长 \(|a|=\sqrt{x^2+y^2+z^2}\) 点 ...
- 洛谷P4518 [JSOI2018]绝地反击(计算几何+二分图+退流)
题面 传送门 题解 调了咱一个上午-- 首先考虑二分答案,那么每个点能够到达的范围是一个圆,这个圆与目标圆的交就是可行的区间,这个区间可以用极角来表示 首先,如果我们知道这个正\(n\)边形的转角,也 ...
- 洛谷P4517 [JSOI2018]防御网络(dp)
题面 传送门 题解 翻译一下题意就是每次选出一些点,要用最少的边把这些点连起来,求期望边数 我也不知道为什么反正总之就是暴力枚举太麻烦了所以我们考虑贡献 如果一条边是割边,那么它会在图里当且仅当两边的 ...
- 洛谷P4559 [JSOI2018]列队(主席树)
题面 传送门 题解 首先考虑一个贪心,我们把所有的人按\(a_i\)排个序,那么排序后的第一个人到\(k\),第二个人到\(k+1\),...,第\(i\)个人到\(k+i-1\),易证这样一定是最优 ...
- 洛谷 P4516 [JSOI2018]潜入行动
题面传送门 一眼树形 \(dp\) 本题有 \(2\) 大难点. 难点之一是状态的设计,这里需要四维状态,\(dp[i][j][0/1][0/1]\) 表示在以 \(i\) 为根的子树内放了 \(j\ ...
随机推荐
- C#递归所以部门展示到TreeView
C#递归所以部门展示到TreeView 1.首先是数据库表的设计 新建一张部门表:TestUser表 1.ID自增int主键 2.DeptName:nchar(10)3.DeptCode:nchar( ...
- 页面布局整理(基于scss)
页面开发步骤: 1.全局reset.设置基础背景色.设置基础字体样式 2.全局布局页面结构,meta 标签引入 3.按钮等相同的样式,用scss提前写好一份公用,渐变等 border-radius b ...
- winform问题集锦
正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码 说明 .NET2.0中增加了42种非常强大的调试助手,MDA.Loaderlock 是其中之一.L ...
- 微信小程序中遇到的wx:if问题
最近在项目中遇到wx:if问题进行梳理一下,有个需求就是有数据的时候显示数据列表,没有数据的时候就显示‘去赚钱’的页面,这可以放在一个页面进行显示,就要用到wx:if判断.我在js中设置了一个变量sh ...
- Areas in ASP.NET MVC 4
Download source - 2.7 MB Introduction to Areas In this article, we will learn the concept of Areas a ...
- [转] const T、const T*、T *const、const T&、const T*& 的区别
这里的T指的是一种数据类型,可以是int.long.doule等基本数据类型,也可以是自己类型的类型class.单独的一个const你肯定知道指的是一个常量,但const与其他类型联合起来的众多变化, ...
- 【原创】0. MYSQL++的环境准备
1. 获取 Google MYSQL++,第一个就是,然后跟着要求进行下载. 2. 编译和安装 其实在作者的各种README文档里面已经写得很清楚了,现在对一些可能会出现问题的地方进行一下回顾. Wi ...
- 刷题向》DP》关于基础DP(easy)
openjudge 8464 这道题其实很简单,算是DP的基础题,比较适合开拓DP思维. 题目比较有欺骗性,其实稍微想想就可以解决,因为题意说第一次卖出后才能买入,所以我们可以考虑枚举断点,所以题目 ...
- 一个虚拟机网络的XML描述
<?xml version="1.0" encoding="utf-8"?> <VNET> <ID>1</ID> ...
- 1-new对象与直接构建对象
#include <iostream> using namespace std; class A { public: A(){} A (int a){ this->a = a; } ...