MENU

最大部分配列問題(連続部分列の総和の最大値)をセグ木に載せる

ark4rk.hatenablog.com

これを事前に読んで欲しいです。
分割統治法の方針でセグ木に乗せられます
これにより、

  • 点更新
  • [l,r)間の連続部分列における総和の最大値を求める

が出来ます

( (左端を含む最大部分配列),(右端を含む最大部分配列),(区間の最大部分配列),(区間の総和))
からなるベクトルを考えると、これがモノイドになっています。

試しにベクトルsとベクトルtをくっつけてs\times tを作ってみます。

  •  s\times tの(左(右)端を含む最大部分配列):

(sの左端を含む最大部分配列)
(sの区間の総和)+(tの左端を含む最大部分配列)
の2つが条件を満たすので、maxを取ります
右端も同様です

  •  s\times t区間の最大部分配列:

中央をまたぐやつとまたがないやつを考える分割統治法の王道により
(sの最大部分配列)
(tの最大部分配列)
(sの右端を含む最大部分配列)+(tの左端を含む最大部分配列)
のmaxです

  •  s\times tの総和:

(sの総和)+(tの総和)
それはそう

よって上手くセグ木に乗せられます(モノイドの要件を満たすのは意味論より明らか)

ps.この方法によって s*t*u=max(0,max(0,s+t),u)みたいな演算をモノイドとして処理出来たりもします(kadaneのアルゴリズムより)