ynoi2013-d2t2-post

[Ynoi2013] D2T2

link

对序列分块,最大子段和是一个可以合并的信息,对于一个询问,如果对每个整块求出这块保留 \([L,R]\) 内的数得到的最大子段和相关信息(和,最大前缀,最大后缀,最大子段和)则把它们合并就是答案。

一个长度为 \(B\) 的块其实只有 \(\mathcal O(B^2)\) 种本质不同的 \([L,R]\),因为块内只有 \(B\) 种数。

考虑对每个块预处理每种值域区间对应的答案。这里用到了分治的技巧。我们要求序列上一个块的所有 \(\mathcal O(B^2)\) 种答案,可以将序列块分成两半,左边分治求出 \(\frac{B^2}4\) 种答案,右边分治求 \(\frac{B^2}4\) 种答案。

然后枚举 \(\mathcal O(B^2)\) 种值域区间,每个区间求出左边的所有值域区间中最大的被当前区间包含的区间,右边也求出来。那么就可以由这两个区间的答案合并。

这两个区间可以四个双指针求,复杂度即 \(T(n)=2T(\frac n2)+\Theta(n^2)\),得 \(\Theta(T(n))=\Theta(n^2)\)

于是每个长度为 \(B\) 的块分治复杂度就是 \(\Theta(B^2)\)。总的分治复杂度是 \(\Theta(nB)\)

由于要求线性空间还要逐块处理,\(m\) 视作与 \(n\) 同阶则询问复杂度为 \(\Theta(nB+\frac{n^2}B)\)

\(B=\Theta(\sqrt n)\) 总共复杂度 \(\Theta(n\sqrt n)\)

posted @ 2024-03-07 07:44  iorit  阅读(15)  评论(0)    收藏  举报