Loading

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\) , 答案就是

\[a_x + a_{c_1 + 1} + \max_{i \in (c_1 + 1, r]} a_i \]

为什么呢?
考虑 \(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} $

这个过程可以直接使用线段树维护, 而对于询问直接求出区间最小值即可

总结

一个挺好的贪心问题

扫描线: 枚举一维维护一维
单调栈用于动态维护最值问题, 这也是常见的一段一段维护的问题, 往往是跟后缀最小值有关的

posted @ 2025-04-13 21:13  Yorg  阅读(11)  评论(0)    收藏  举报