CF1470F
对于这两个矩形的相对位置只有三种情况:
(1)相离,那么分为上下相离和左右相离两种,只考虑左右,那么左边矩形的右边界一定是将 \(x\) 坐标离散化后某个 \(x_i\),右矩形的左边界则是 \(x_{i+1}\),那么直接预处理前后缀 \(\min y, \max y\) 即可,复杂度是 \(O(n)\)。
(2)交叉,那么横着的矩形左右边界是最小 / 最大的 \(x\)(记为 \(Lx,Rx\)),竖着的上下边界是 \(Ly,Ry\),考虑枚举竖着的左边界 \(l\),对于一个右边界 \(r\),答案为
对每个 \(i\) 预处理 \(\text{prefix max / min } y_j\),由于 \(Lx,Rx,Ly,Ry\) 都是常量,只需维护形如 \(C_1 \times x_r + C_2 \times (v_{1,r} - v_{2,r})\),每次扫到 \(l\) 是全局 \(v_1\) 取 \(\max\),\(v_2\) 取 \(\min\),注意到随 \(l\) 递增这个修改量是单调的,同时对于降序的 \(r\) 它们的后缀 \(\max / \min\) 是单调的,所以可以线段树二分区间赋值,然后维护区间最值即可,复杂度是 \(O(n \log n)\)。
(3)角落重叠,那么分为左下和右上、左上和右下两种情况,这里只考虑左下右上,那么左下的左下角和最小的能覆盖整个点集的矩形的左下角重合,右上的右上角和其右上角重合(草),考虑枚举左下角矩形的右边界 \(l\),设右上矩形左边界为 \(r\)(注意这里 \(r \le l\)(草)),先预处理前缀 \(y\) 的 \(\max\) 和后缀 \(y\) 的 \(\min\),由于需要满足矩形相交,所以一个 \(l\) 对应了一段区间的 \(r\)(前缀 \(\max\) 和后缀 \(\min\) 相当于是这两个矩形的上下边界)。考虑 \(r\) 的贡献,即
这个形如 \(A_r \times x_l + B_r \times y_l\),那么我们可以对每个 \(r\) 维护函数 \(y = B_r x + A_r\),每次即求 \(x = \dfrac{y_l}{x_l}\) 处的最值,所以我们要支持的就是区间查询 \(x\) 处的一次函数最值,这可以使用线段树套李超树在 \(O(n \log^2 n)\) 时间 \(O(n \log n)\) 空间内完成(注意李超树的空间是 \(O(n)\) 的。)
于是可以 \(O(n \log^2 n)\)。
bonus:区间凸包也可以使用 P3309 向量集 的做法,具体来讲就是线段树上用 vector 存区间凸包(,时空复杂度都是一样的。

                
            
        
浙公网安备 33010602011771号