F - Sums of Sliding Window Maximum Editorial
by
kyopro_friends
公式解説より、この問題は「区間等差数列加算」ができれば解けることがわかります。これは遅延セグ木を用いて行えます。
ACLに則った実装は以下の通りです
struct S{
int val_sum, index_sum, len;
};
struct F{
int a,b;
};
S e(){return S{0,0,0};}
S op(S x,S y){
return S{x.val_sum + y.val_sum,
x.index_sum + y.index_sum,
x.len + y.len};
}
F id(){return F{0,0};}
F composition(F f,F g){return F{f.a+g.a, f.b+g.b};}
S mapping(F f,S x){
return S{x.val_sum + f.a*x.index_sum + f.b*x.len,
x.index_sum,
x.len};
}
セグ木に載せる各ノードを \((A_i,i,1)\) で初期化し、区間 \([L,R)\) に対する \(A_i \leftarrow A_i+ai+b\) という操作は apply(L,R,F{a,b})
となります。
posted:
last update: