2019.02.21 bzoj5317: [Jsoi2018]部落战争(凸包+Minkowski和)
传送门
题意:qqq次询问把一个凸包整体加一个向量(x,y)(x,y)(x,y)之后是否与另外一个凸包相交。
思路:转化一下发现只要会求A+B={v⃗=a⃗+b⃗∣a⃗∈A,b⃗∈B}A+B=\{\vec v=\vec a+\vec b|\vec a\in A,\vec b\in B\}A+B={v=a+b∣a∈A,b∈B}即可,这个要用到一个叫做MinkowskiMinkowskiMinkowski和的东西。
不会的可以画个图,发现最后的向量集组成的凸包每条边都是由A,BA,BA,B中的边拼成的,于是我们提出A,BA,BA,B的所有边然后归并一下即可。
代码:
#include<bits/stdc++.h>
#define int long long
#define ri register int
using namespace std;
inline int read(){
int ans=0;
bool f=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f^=1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return f?ans:-ans;
}
typedef long long ll;
const int N=1e5+5;
struct pot{
ll x,y;
pot(ll _x=0,ll _y=0):x(_x),y(_y){};
friend inline pot operator+(const pot&a,const pot&b){return pot(a.x+b.x,a.y+b.y);}
friend inline pot operator-(const pot&a,const pot&b){return pot(a.x-b.x,a.y-b.y);}
friend inline ll operator^(const pot&a,const pot&b){return a.x*b.y-a.y*b.x;}
friend inline bool operator<(const pot&a,const pot&b){return a.x==b.x?a.y<b.y:a.x<b.x;}
}A[N<<1],a1[N],a2[N];
inline void graham(pot a[],int&n){
static int q[N],top;
static pot b[N];
sort(a+1,a+n+1);
q[top=1]=1;
for(ri i=2;i<=n;++i){
while(top>1&&((a[i]-a[q[top-1]])^(a[q[top]]-a[q[top-1]]))<=0)--top;
q[++top]=i;
}
for(ri len=top,i=n-1;i;--i){
while(top>len&&((a[i]-a[q[top-1]])^(a[q[top]]-a[q[top-1]]))<=0)--top;
q[++top]=i;
}
n=top;
for(ri i=1;i<=n;++i)b[i]=a[q[i]];
memcpy(a,b,sizeof(b));
}
inline void Minkowski(pot a[],int&tot,pot x[],int n,pot y[],int m){
static int pa,pb;
a[tot=1]=x[pa=1]+y[pb=1];
while(pa<n&&pb<m){
pot ta=x[pa+1]-x[pa],tb=y[pb+1]-y[pb];
++tot;
if((ta^tb)<=0)a[tot]=a[tot-1]+ta,++pa;
else a[tot]=a[tot-1]+tb,++pb;
}
while(pa<n)++tot,a[tot]=a[tot-1]+x[pa+1]-x[pa],++pa;
while(pb<m)++tot,a[tot]=a[tot-1]+y[pb+1]-y[pb],++pb;
--tot;
graham(a,tot);
--tot;
}
int n,m,len,q;
inline bool check(const pot&p){
if(((p-A[1])^(A[len]-A[1]))>0)return 0;
if(((p-A[1])^(A[2]-A[1]))<0)return 0;
int l=2,r=len-1,ans=2;
while(l<=r){
int mid=l+r>>1;
if(((p-A[1])^(A[mid]-A[1]))>=0)l=mid+1,ans=mid;
else r=mid-1;
}
return ((p-A[ans])^(A[ans+1]-A[ans]))>=0;
}
signed main(){
n=read(),m=read(),q=read();
for(ri i=1;i<=n;++i)a1[i].x=read(),a1[i].y=read();
for(ri i=1;i<=m;++i)a2[i].x=-read(),a2[i].y=-read();
graham(a1,n),graham(a2,m);
Minkowski(A,len,a1,n,a2,m);
for(ri x,y;q;--q)x=read(),y=read(),cout<<check(pot(x,y))<<'\n';
return 0;
}
2019.02.21 bzoj5317: [Jsoi2018]部落战争(凸包+Minkowski和)的更多相关文章
- 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$ ...
- 2019.02.21 bzoj1249: SGU277 HERO 动态凸包(set+凸包)
传送门 题意:动态插入点,维护凸包面积. 思路:用setsetset维护极角序来支持面积查询即可. 然后注意选原点的时候要从初始三个点随机平均系数来避免精度误差. 代码: #include<bi ...
- 【BZOJ5317】[JSOI2018]部落战争(凸包,闵可夫斯基和)
[BZOJ5317][JSOI2018]部落战争(凸包,闵可夫斯基和) 题面 BZOJ 洛谷 题解 很明显我们只需要两个凸包\(A,B\). 假设询问给定的方向向量是\(v\). 那么现在就是判断\( ...
- 2019.02.21 bzoj2300: [HAOI2011]防线修建(set+凸包)
传送门 题意:动态维护凸包周长. 思路: 见这篇求面积的吧反正都是一个套路. 代码: #include<bits/stdc++.h> #define int long long #defi ...
- 2019.02.21 bzoj2829: 信用卡凸包(凸包)
传送门 题意:给nnn个A∗BA*BA∗B的矩形,其中每个矩形的四个角被改造成了半径为rrr的四分之一 圆,问这些矩形的凸包周长. 思路:考虑求出圆心的凸包周长然后加上一个整圆的周长,证明很简单,略掉 ...
- BZOJ 5317: [Jsoi2018]部落战争
传送门 写出式子,若存在 $a \in A$,$b \in B$,使得 $b+v=a$,那么此方案会产生冲突 即存在 $a \in A$,$b \in B$,使得 $v=a+(-b)$,设 $C=A+ ...
- 2019.02.21 bzo1038: [ZJOI2008]瞭望塔(半平面交)
传送门 题意:给出一个nnn个点的轮廓,要求找一个高度最小的点使得它能够看见所有拐点. 思路:之间建半平面交然后取半平面交上的每个交点和每个轮廓更新答案即可. 代码: #include<bits ...
- 2019.02.21 bzoj2739: 最远点(决策单调性+分治)
传送门 题意简述:给一个N个点的凸多边形,求离每一个点最远的点. 思路:先根据初中数学知识证明决策是满足单调性的,然后上分治优化即可. 才不是因为博主懒得写二分+栈优化呢 代码: #include&l ...
随机推荐
- python数据处理 pandas用法大全
一.生成数据表 1.首先导入pandas库,一般都会用到numpy库,所以我们先导入备用: import numpy as np import pandas as pd 1 2 2.导入CSV ...
- 剑指offer题目解答合集(C++版)
数组中重复的数字 二维数组中查找 字符串 替换空格 二叉树的编码和解码 从尾到头打印链表 重建二叉树 二叉树的下一个节点 2个栈实现队列 斐波那契数列 旋转数字 矩阵中的路径 机器人的运动范围 剪绳子 ...
- C语言 链表(Dev C++/分文件版)
头文件:quechain.h struct Question { int _id; struct Question* pre; struct Question* next; }; void chain ...
- Android Studio2.0 教程从入门到精通Windows版
系列教程 Android Studio2.0 教程从入门到精通Windows版 - 安装篇Android Studio2.0 教程从入门到精通Windows版 - 入门篇Android Studio2 ...
- 关于java字节码框架ASM的学习
一.什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为 ...
- ORACLE日常操作手册
转发自:http://blog.csdn.net/lichangzai/article/details/7955766 以前为开发人员编写的oracle基础操作手册,都基本的oracle操作和SQL语 ...
- python 如何把小数变成百分数格式
1. 数据样本 ,valid_rate,homework_rate,inter_rate,playback_rate,zhujiang_good_comment5_rate,fudao_good_co ...
- Swift 通过运行时获取属性名列表
import UIKit //必须要有@objcMembers修饰符,否则获取到的成员属性为0 @objcMembers class Person: NSObject { var name: Stri ...
- C# String 与 StringBuilder
String 字符串不可变性,每次为字符串进行增删或重写赋值会销毁原来的字符串,重新开辟内存空间,因此是非常消耗资源的 字符串可以看做是 char 数组,因此可以用 foreach 对其进行遍历,或者 ...
- vue初体验
作为一个前端的小菜鸟,在平时的开发与学习中,除了要深入了解javascript 及 css 的各种特性,熟悉一门框架也是必不可少的.vue以其小巧,轻便,学习平滑等各种特性深受欢迎. 这里总结一下小菜 ...