[CF1635F] Closest Pair
前言
本来说看看算了的, 这个太猎奇了必须想一下
思路
这种询问是一个区间的, 确实不好搞
先不管询问区间
考虑 \(x\) 是有单调性的, 从这里入手
如果我们钦定 \(x_j\), 现在要找到 \(\min\limits_{i < j} (x_j - x_i)(w_i + w_j)\), 怎么做?
不难发现我们可以只考虑在单调栈中的 \(i\), 这是显然的
那么咋做啊?
考虑每次加入一个元素, 理论上整个单调栈\((\)未更新时\()\) 都可能作为 \(i\), 没有优化的空间了
这个时候引入一种新的方法: 记录当前点作为左端点的最优解
此时只有 \(w_i > w_j\), 也就是会被弹出的那些点以及最后没被弹出的那个点的答案才可能会被更新, 因为不被弹出的点一定可以找到距离更近高度更小的点
在这个基础上, 询问区间也很简单了, 只需要从右往左枚举询问右端点, 然后区间查询对应的左端点即可
总结
一个非常特殊的处理方法
首先通过枚举确定考虑的元素都是一个前缀
然后通过维护每个点作为左端点的信息维护区间询问

浙公网安备 33010602011771号