Henceforth

区间所有子区间的最大子段和之和。

\(r\) 扫描线。维护 \([i,r]\) 的最大子段和,做个历史和。

考虑以 \(r\) 为右端点的最大子段和能更新的答案,对于一个区间 \([l,r]\),其能被更新仅当 \(sum_r-\min\limits_{i=l-1}^{r-1}sum_i>ans_l\)\(ans_l+\min\limits_{i=l-1}^{r-1}sum_i<sum_r\)

可证明 \(ans_l+\min\limits_{i=l-1}^{r-1}sum_i\) 前面这部分关于 \(l\) 递减。考虑答案组成是 \(\max_{j<i} sum_i-sum_j\),可简单放缩证明。

于是可以二分出这个 \(<\) 的分界线,修改为一段后缀。现在相当于要支持的操作是,区间赋值 \(a\),区间令 \(b=k-a\),区间查询 \(b\) 历史和。还有维护个区间 \(b\) 最小值。

维护矩阵 \(\begin{bmatrix}suma&sumb&hsum&len\end{bmatrix}\)

区间赋值 \(a\) 即乘上

\[\begin{bmatrix}0&0&0&0\\0&1&0&0\\0&0&1&0\\k&0&0&1 \end{bmatrix} \]

区间令 \(b=k-a\) 即乘上

\[\begin{bmatrix}1& -1&0&0\\0&0&0&0\\0&0&1&0\\0&k&0&1 \end{bmatrix} \]

更新一次历史和即乘上

\[\begin{bmatrix}1& 0&0&0\\0&1&1&0\\0&0&1&0\\0&0&0&1 \end{bmatrix} \]

posted @ 2024-11-11 09:21  Terac  阅读(32)  评论(0)    收藏  举报