[JSOI2018] 战争(闵可夫斯基和 + 二分)

这篇博客介绍了如何利用闵可夫斯基和解决JSOI2018中关于凸包和向量移动的交集查询问题。通过计算两个凸包的闵可夫斯基和,并转化为判断点在凸包内的二分查找方法,实现了O(n+qlogn)的时间复杂度解决方案。

题意

给出两个凸包 A,BA,BA,B,有 qqq 次询问,每次询问给出向量 (dx,dy)(dx,dy)(dx,dy),问 BBB 所有点移动 (dx,dy)(dx,dy)(dx,dy) 是否与 AAA 有交集。
其中,∣A∣,∣B∣,q≤105|A|,|B|,q\le 10^5A,B,q105

分析

前置知识——闵可夫斯基和

定义两个点集 A,BA,BA,B 的闵可夫斯基和为 C={ a+b∣a∈A,b∈B}C = \{a+b|a\in A, b \in B\}C={ a+baA,bB}
如下图,粉色区域是一个四边形和一个三角形的闵可夫斯基和。
在这里插入图片描述
结论:两凸包的闵可夫斯基和仍然是一个凸包。(证明略)

求闵可夫斯基和

因为两个凸包的所有边都会出现在他们的闵可夫斯基和上。因此,我们按边的极角序来加入边,起点为两个凸包的起点相加。由于两个凸包的边本身就是有序的,因此直接归并排序即可。复杂度是 O(n+m)O(n+m)O(n+m)

回到题目

C={ a−b∣a∈A,b∈B}C=\{a-b|a\in A, b \in B\}C={ abaA,bB}。则题目等价于判断 (dx,dy)(dx,dy)(dx,dy) 是否在凸包 CCC 中。
CCC 则是 AAA−B-BB 的闵可夫斯基和。然后就是一个点在凸包内的问题了,先判断一下点和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值