4.12 CW 模拟赛 T4. 3SUM
前言
当思维体操了, 顺手尝试一下新的补题方法
思路
首先需要观察到询问序列中的最大值是解决问题的关键
利用这个显然可以 \(\mathcal{O} (1)\) 求出分两段的最优解, 需要计算 \(\rm{RMQ}\) \(\mathcal{O} (n \log n) - \mathcal{O} (1)\)
尝试对分三段的情况进行分析
设三段分别为 \(A, B, C\), 考虑分类讨论
最大值在 \(B\) 中
显然是简单的, 直接往最左最右拓展即可
最大值在 \(A / C\) 中
显然两种情况对称, 以下只考虑 \(A\) 的情况
这种情况非常复杂
不妨设最靠左的最大值位置为 \(x\), 显然需要满足 \(x \leq r - 2\), 分割线 \(x \leq c_1 < n - 1\)
考虑枚举 \(c_1\) , 答案就是
为什么呢?
考虑 \(c_1\) 无论在哪, \(A\) 贡献一定
对于 \(B + C\) 的贡献, 就是我们最初说的 \(\mathcal{O} (1)\) 求出分两段的最优解
形式表示就是 \(\max\limits_{i \in [c_1 + 1, r]} a_i + \min \big\{ a_r, a_{c_1 + 1} \big\}\)
考虑如果 \(a_r < a_{c_1 + 1}\), 那么一定不如 \(c_1 + 1 = n - 1\) 的时候优秀
如果 \(a_r \geq a_{c_1 + 1}\), 那么是有可能取到最优解的
总的来讲, 注意到如果中间连续段长度大于 \(1\), 那么把最大值换成最右边的那个点显然不劣
考虑维护这个东西, 首先离线询问, 从左往右维护
记 $ b_i = a_i + \max\limits_{j=i+1}^{r} a_j $, 使用一个单调栈来维护最大值的变化
每弹出一个数 $ st_x $, 发现对于 $ i \in [st_{x-1}, st_x) $ 的 $ b_i $ 都会改变, 也就是 $ b_i \stackrel{+}{\leftarrow} a_r - a_{st_x} $
这个过程可以直接使用线段树维护, 而对于询问直接求出区间最小值即可
总结
一个挺好的贪心问题
扫描线: 枚举一维维护一维
单调栈用于动态维护最值问题, 这也是常见的一段一段维护的问题, 往往是跟后缀最小值有关的

浙公网安备 33010602011771号