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: