题目链接

题意

给你两个点集。

q次询问 , 每次把其中一个点集往一个方向移动 , 问两个点集的凸包还有没有交。

Sol

闵可夫斯基和板子题。

把问题做如下转换:

我们本来两个凸包相交是相当于是对于移动向量 \(c\) 来说 , 存在分别在两个点集中的向量 \(a,b\) 有 \(b+c=a\)

也就是 \(c=a-b, c=a+(-b)\)

我们先求出第一个点集的凸包和第二个点集的按原点对称后的凸包。

现在要做的就是求出一个凸多边形 \(C\) 满足两个点集中的任意一对向量的和在该凸多边形内部。

之后我们就只需要判断点是否在凸包内。

这个就可以用闵可夫斯基和来解决。

求解方法:

首先求出这两个向量集合构成的凸包。

然后以按照最小向量和为起点对所有凸包上的边极角排序,一个个顺次连起来就做完了。

做完后由于可能出现共线情况就再求一次凸包。

关于判断点是否在凸包内:

以凸包左下角的点为极点 , 二分找到第一个极角小于给定向量的边(没有则不在凸包内) , 判断下一条边的向量和 给定向量到这个向量差向量 的方向关系 , 如果在左边则给定向量不在凸包内。

#include<bits/stdc++.h>
using namespace std;
#define Set(a,b) memset(a,b,sizeof(a))
template<class T>inline void init(T&x){
x=0;char ch=getchar();bool t=0;
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') t=1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch-48);
if(t) x=-x;return;
}typedef long long ll;
typedef double R;
const int N=1e5+10;
const R PI=acos(-1),eps=1e-10;
int n,m,q;
struct point{
R x,y;
point(R _x=0.0,R _y=0.0){x=_x,y=_y;}
inline bool operator <(const point b)const{return x<b.x||(x==b.x&&y<b.y);}
inline R operator *(const point b)const{return x*b.y-b.x*y;}
inline point operator *(const R d){return point(x*d,y*d);}
inline point operator /(const R d){return point(x/d,y/d);}
inline point operator +(const point b){return point(x+b.x,y+b.y);}
inline point operator -(const point b){return point(x-b.x,y-b.y);}
inline R len(){return sqrt(x*x+y*y);}
}P1[N],P2[N];
inline int fcmp(R x){if(x>eps) return 1;if(x<-eps) return -1;return 0;}
inline bool cmp(point A,point B){return A*B>0||(A*B==0&&A.len()<B.len());}
inline void Convex_Hull(point*P,int&n){
sort(P+1,P+1+n);point Base=P[1];
for(int i=n;i;--i) P[i]=P[i]-Base;
sort(P+2,P+1+n,cmp);int r=1;
for(int i=2;i<=n;++i) {while(r>1&&(P[i]-P[r])*(P[r]-P[r-1])>=0) --r;P[++r]=P[i];}
n=r;for(int i=1;i<=n;++i) P[i]=P[i]+Base;
return;
}
struct line{
point A,B;R ang;
line(point _A=point(),point _B=point()){A=_A,B=_B-_A,ang=atan2(B.y,B.x);}
inline bool operator <(const line b)const{return ang<b.ang;}
};
inline void Minkowski_Sum(point*A,point*B,int n,int m,point*C,int&node){
A[n+1]=A[1],B[m+1]=B[1];node=0;
static point L1[N],L2[N];int l1=0,l2=0;
for(int i=1;i<=n;++i) L1[i]=A[i+1]-A[i];
for(int i=1;i<=m;++i) L2[i]=B[i+1]-B[i];
point Base=A[1]+B[1];C[node=1]=Base;
l1=l2=1;
while(l1<=n&&l2<=m) ++node,C[node]=C[node-1]+(L1[l1]*L2[l2]>=0? L1[l1++]:L2[l2++]);
while(l1<=n) ++node,C[node]=C[node-1]+L1[l1++];
while(l2<=m) ++node,C[node]=C[node-1]+L2[l2++];
Convex_Hull(C,node);return;
}
point Ans[N<<1];int node=0;
inline bool Judge(point A){// 点是否在凸包内
if(A*Ans[2]>0||A*Ans[node]<0) return 0;
int p=lower_bound(Ans+1,Ans+1+node,A,cmp)-Ans-1;
return (A-Ans[p])*(Ans[p%node+1]-Ans[p])<=0;
}
int main()
{
init(n),init(m),init(q);
int x,y;
for(int i=1;i<=n;++i) {
init(x),init(y);
P1[i]=point(x,y);
}
for(int i=1;i<=m;++i) {
init(x),init(y);
x=-x,y=-y;
P2[i]=point(x,y);
}
Convex_Hull(P1,n);
Convex_Hull(P2,m);
Minkowski_Sum(P1,P2,n,m,Ans,node);
point base=Ans[1];
for(int i=1;i<=node;++i) Ans[i]=Ans[i]-base;
for(int i=1;i<=q;++i) {
init(x),init(y);
point B=point(x,y)-base;
if(Judge(B)) puts("1");
else puts("0");
}
return 0;
}

【LuoguP4557】[JSOI2018]战争的更多相关文章

  1. [JSOI2018]战争

    题目描述 九条可怜是一个热爱读书的女孩子. 在她最近正在读的一本小说中,描述了两个敌对部落之间的故事.第一个部落有 nnn 个人,第二个部落有 mmm 个人,每一个人的位置可以抽象成二维平面上坐标为 ...

  2. P4557 [JSOI2018]战争

    首先可以题目描述的两个点集是两个凸包,分别设为A和B. 考虑一个向量w不合法的条件. 即存在b+w=a,其中a属于A,b属于B. 也就是a-b=w. 即对b取反后和a的闵可夫斯基和. 求出闵可夫斯基和 ...

  3. BZOJ5317:[JSOI2018]战争(闵可夫斯基和)

    令 \(a\in A,b\in B\) 则移动向量 \(\omega\) 使得存在 \(b+\omega=a\) 那么 \(\omega\) 需要满足 \(\omega=a−b\) 黑科技:闵可夫斯基 ...

  4. 洛谷P4557 [JSOI2018]战争(闵可夫斯基和+凸包)

    题面 传送门 题解 看出这是个闵可夫斯基和了然而我当初因为见到这词汇是在\(shadowice\)巨巨的\(Ynoi\)题解里所以压根没敢学-- 首先您需要知道这个 首先如果有一个向量\(w\)使得\ ...

  5. [JSOI2018]战争(闵可夫斯基和)

    害怕,可怜几何题 果然不会 题目就是说给你两个凸包,每次询问给你一个向量 \(c\) 问你能不能从两个凸包 \(A\) , \(B\) 里分别找到一个点 \(a\) , \(b\) 满足 \(a+c= ...

  6. 计算几何细节梳理&模板

    点击%XZY巨佬 向量的板子 #include<bits/stdc++.h> #define I inline using namespace std; typedef double DB ...

  7. HHHOJ #151. 「NOI模拟 #2」Nagisa

    计算几何板子题(我才没有拷板子的说--) 众所周知,三角形的重心坐标是\((\frac{x_1+x_2+x_3}{3},\frac{y_1+y_2+y_3}{3})\) 然后我们发现如果我们有一个点集 ...

  8. 【学习笔记】Minkowski和

    这还是个被我咕了N久的玩意 Minkowski和是一个奇怪的玩意 他长这样 $S={a+b \| a \in A , b \in B}$ AB可以是点集也可是向量集(显然) 他可以处理一些奇怪的东西 ...

  9. JSOI部分题解

    JSOI部分题解 JSOI2018 战争 问题转化为给定你两个凸包\(\mathbb S,\mathbb T\),每次独立的询问将\(\mathbb T\)中的每个点移动一个向量,问\(\mathbb ...

随机推荐

  1. C#连接oracle数据库报错:OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用

    原因大概是OracleOraDb11g_home1TNSListener服务没启动的原因 步骤一.停止并重新启动OracleOraDb11g_home1TNSListener服务,试一下是否可行. 如 ...

  2. 自然语言处理工具hanlp定制用户词条

    作者:baiziyu 关于hanlp的文章已经分享过很多,似乎好像大部分以理论性的居多.最近有在整理一些hanlp应用项目中的文章,待整理完成后会陆续分享出来.本篇分享的依然是由baiziyu 分享的 ...

  3. 走环概率问题(至今有点迷)--牛客第二场( Eddy Walker)

    思路: 概率结论题,好像属于线性递推,现在也不太懂(lll¬ω¬) #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include < ...

  4. spring boot @Value源码解析

    Spring boot 的@Value只能用于bean中,在bean的实例化时,会给@Value的属性赋值:如下面的例子: @SpringBootApplication @Slf4j public c ...

  5. ABCD 谁是小偷

    题目: 警察局抓了a,b,c,d 4名偷窃嫌疑犯,其中只有一人是小偷.审问中,a说:“我不是小偷.”b说:“c是小偷.”c说:“小偷肯定是d.”d说:“c在胡说.” 现在已经知道这四人中有三人说的是真 ...

  6. 07-django项目连接远程mysql数据库

    比如电脑a(ip地址为192.168.0.aaa)想要连接访问电脑b(ip地址为192.168.0.bbb)的数据库: 对电脑a(ip地址为192.168.0.aaa): 在项目settings.py ...

  7. Spark 2.43读取.json文件入库到MySQL 8

    如果没有安装包,可以用我的这个 百度网盘链接点击进入 提取码: eku1 解压之后 准备开始配置环境变量 如果运行时候报错参考 (java.io.IOException: Could not loca ...

  8. Linux排查磁盘空间顺序解决空间不足问题

    1 先查看整个磁盘的情况 df    -h                     查看整台服务器的硬盘使用情况 cd    /                       进入根目录 du   -s ...

  9. SSD源码解读——数据读取

    之前,对SSD的论文进行了解读,可以回顾之前的博客:https://www.cnblogs.com/dengshunge/p/11665929.html. 为了加深对SSD的理解,因此对SSD的源码进 ...

  10. VMware三种网络模式详解

    转载自https://www.cnblogs.com/linjiaxin/p/6476480.html 好文章怕原始地址会不能用,转载到自己这里,感谢原作者的无私奉献. 由于Linux目前很热门,越来 ...