[NOIP2025] 序列询问

给定长度为 \(n\) 的序列 \(A\)。有 \(q\) 次询问,每次询问给定区间 \([L,R]\),你需要对所有 \(i \in [1,n]\) 求出 \(\max\limits_{1 \leq l \leq i \leq r \leq n \land r-l+1 \in [L,R]} \sum\limits_{j=l}^{r} a_j\)

\(1 \leq n \leq 5 \times 10^4\)\(1 \leq q \leq 1024\)\(|a_i| \leq 10^5\)

严肃对 Purslane 题解进行大学习。

考虑 \(2L \geq R\) 的时候怎么做。发现此时一个包含 \(i\) 的区间 \([l,r]\) 必然满足 \(i-l+1 \leq L\)\(r-i+1 \leq L\)。若否,则有 \(i-l+1 > L\)\(r-i+1 > L\),可得 \(r-l+1 \geq 2L+1\)。而 \(r-l+1 \leq R\),得到 \(2L+1 \leq R\),与 \(2L \geq R\) 矛盾。

接下来我们发现满足 \(l \in [i-L+1,i]\)\(r \in [i,i+L-1]\) 的合法区间都包含 \(i\),这一点是显然的。此时我们可以对于每个 \(i\),预处理出以 \(i\) 为左端点或右端点的合法区间的 \(\sum\limits_{j=l}^{r} a_j\) 最大值,查询是滑动窗口的形式。容易发现,预处理的部分也是滑动窗口的形式,此时我们可以在 \(O(n)\) 的时间复杂度内解决问题。

接下来我们考虑没有特殊性质的情况,可以简单进行二进制分拆,这样就可以做到 \(O(qn\log n)\)。我们考虑更牛一点,在询问时拆成 \([L,2^p]\)\([2^p,2^q]\)\([2^q,R]\) 三个区间,就可以在 \(O(n \log^2 n)\) 的时间内进行预处理,查询是 \(O(n)\) 的,可以做到 \(O(n\log^2 n+qn)\) 的时间复杂度。

posted @ 2025-11-29 20:31  Oken喵~  阅读(4)  评论(0)    收藏  举报