专栏文章

[NOIP2025] 序列询问

P14638题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mimxnbuz
此快照首次捕获于
2025/12/01 17:14
3 个月前
此快照最后确认于
2025/12/01 17:14
3 个月前
查看原文
这个问题看上去比较双栈模拟,所以一个非常自然的想法是考虑分块。首先将原序列按照 RR 的大小分块,则 l,rl,r 只有可能是属于同一块或处在相邻两个块的,分别考虑两种情况:
1.1. l,rl,r 在同一个块 dd 中:对于每一个块,内部的区间的长度一定不会超过 RR,所以仅需要考虑 L\geq L 一侧的贡献,可以想到每次分块使得限制减少一,故可以再对这个块 dd 按照 LL 为大小进行分块,我们把再分块的块称为小块,则有这样的几种情况:
  • ppllrr 处在同一个小块,不妨考虑 ppll 处在同一个块的情况,对于 lpl\leq p,此时对于任意的 rr,若 rl+1Lr-l+1\geq L,则 pp 一定在 [l,r][l,r] 之中,故只需考虑对于每一个 ll 求出最优的 rr,这在块 dd 中对应一段后缀,然后在小块中做个前缀 max\text{max} 即可。
  • pp 不与 l,rl,r 中的任意一个处在同一个小块,此时相当于没有对于区间长度的限制,对于每一个小块,计算前面的小块中 sps1-s_{ps-1}max\text{max} 与后面的小块中 spss_{ps}max\text{max} 即可求出跨过该小块的贡献。
2.2. l,rl,r 处在相邻的块中,ll 在块 dd 中,rr 在块 d+1d+1 中,不妨统计的结果的 pp 在块 dd 中,在块 d+1d+1 是对称的。对于 lpl\leq p,任意在块 d+1d+1rr 均满足 p[l,r]p\in [l,r],故对于每一个 ll,求出最优的 rr,求解 rr 可以单调队列简单维护。然后对块 dd 作个前缀 max\text{max} 则可以求出跨过 pp 的结果。
两部分对于每组询问 O(n)O(n),故总复杂度 O(nq)O(nq)

评论

0 条评论,欢迎与作者交流。

正在加载评论...