跳转至

区间最值:按长度滑动窗口

Codex(GPT-6)应用双有序多重集维护滑动窗口,使答案能够按输出顺序直接生成。程序:alternative-sliding-window.cpp。与出题人双堆方案的比较见主解。

方法

从小到大枚举长度 \(L\) .建立第一个长度为 \(L\) 的窗口,随后每次删除最左元素、加入右侧新元素。使用两个 multiset 保存较小和较大部分;较小部分恰有 \(\lfloor L/2\rfloor\) 个元素,所有较小值都不大于较大值。

实现中先把新元素放到较小部分。调整数量时,把较小部分最大值或较大部分最小值移到另一侧;如果边界逆序,再交换边界元素。第一窗口从所有元素在较小部分的状态开始,把最大的若干个移到较大部分即可。之后每轮只删一项、加一项,常数次移动和交换便可恢复不变量。

删除重复值时,仅用迭代器删除一个出现。若该值同时存在两部分,删除任一部分的一个副本,再平衡,代表的窗口多重集仍相同。

正确性与答案

建立第一窗口后,它包含正确的元素多重集;删去离开的一个值并加入进入的一个值,归纳得到所有窗口内容正确。数量及顺序不变量保证划分等于排序后的指定两部分。维护较大部分的和,每次移入、移出或交换时同步更新,它就是当前答案。 固定长度时从左向右输出,随后增大长度,因此无需存储二维答案表。

复杂度与取舍

每个长度需要 \(O(L\log(L+1))\) 初始化和 \(O((n-L)\log(L+1))\) 滑动,总时间 \(O(n^2\log(n+1))\) ,空间 \(O(n)\) .当前程序使用 64 位数值与和。

这与双堆方案是时间同阶、空间更省的并列选择。multiset 的结点分配和删除有额外常数开销,不能仅凭空间优势推断实际更快。适合更重视内存或希望直接输出答案的场景,实测适用性见主解。