これを事前に読んで欲しいです。
分割統治法の方針でセグ木に乗せられます
これにより、
- 点更新
- [l,r)間の連続部分列における総和の最大値を求める
が出来ます
からなるベクトルを考えると、これがモノイドになっています。
試しにベクトルとベクトルをくっつけてを作ってみます。
- の(左(右)端を含む最大部分配列):
の2つが条件を満たすので、maxを取ります
右端も同様です
- の区間の最大部分配列:
中央をまたぐやつとまたがないやつを考える分割統治法の王道により
のmaxです
- の総和:
それはそう
よって上手くセグ木に乗せられます(モノイドの要件を満たすのは意味論より明らか)
ps.この方法によって s*t*u=max(0,max(0,s+t),u)みたいな演算をモノイドとして処理出来たりもします(kadaneのアルゴリズムより)