专栏文章
NOIP 2025 T4 题解
P14638题解参与者 33已保存评论 33
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 31 条
- 当前快照
- 1 份
- 快照标识符
- @mimyq7xn
- 此快照首次捕获于
- 2025/12/01 17:44 3 个月前
- 此快照最后确认于
- 2025/12/01 17:44 3 个月前
提供一个 的赛时做法。
首先考虑 的情况,显然可以用单调队列维护,这启发我们对于一般的情况也用单调队列维护。
具体地,我们先预处理出前缀和 ,考虑依次计算出 的答案。
注意到对于右端点相同的区间,有用的左端点显然只有合法范围( 且 )内 最小的那一个,所以维护的应该是按 升序、 降序排列的单调队列。
为了方便我们在单调队列中维护一个二元对 代表区间,其中 。
考虑怎么动态维护这个东西,显然我们每次将 增加 的时候,要做以下三个操作:
- 删除 的二元对(如果有)
- 如果 ,加入二元对 并删除所有满足 的二元对 (显然这一定是单调队列的一个后缀)
- 将所有满足 且 的二元对的 更新为 (同时要保持单调性,即删除更新后不优于下一项的元素)
前两个操作都是容易的,但第三个操作我们不能暴力修改。
我们发现对于所有 的区间,左端点都不可能再更新了。所以可以分成两个单调队列,将不能更新的放到第一个里面,还能更新的放到第二个里面(当然两个单调队列拼起来之后还要满足单调性)。
对于所有 的区间,它们对应的左端点的合法范围是一个 的后缀,所以右端点越小左端点的合法范围越大,当前的 也就越小。换句话说,第二个单调队列中的 一定是单调不减的,所以我们更新的一定是第二个单调队列的一个后缀。
然而,这样直接暴力更新复杂度也是错的,但我们观察到第二个单调队列一定是由很多 相等的连续段构成的,那么我们只需要用链表维护连续段,就可以做到 合并了。这样时间复杂度就是均摊 的。
具体实现上,我赛时是用 deque 维护单调队列,手写链表,最后一个大样例 1.3s,应该不卡常。
代码等公示再放。
相关推荐
评论
共 33 条评论,欢迎与作者交流。
正在加载评论...