Henceforth

Terac發表於2024-11-11

區間所有子區間的最大子段和之和。

\(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} \]