AtCoder Beginner Contest 293 G問題 Triple Index
問題
提出解答
問題の概要
長さ の整数列 がある.
次の 個の質問に答えよ.
- 質問 : 以下を満たす整数の組 の個数を求めよ.
制約
解法
この問題について, 以下のことがわかる.
- は固定である.
- 求めるべき範囲 は最初に与えられている.
- に対する結果が分かっているとき, における結果は高速に計算できる (方法は後述).
このようなとき, Mo アルゴリズムによって高速に計算できる.
よって, 次の つについてがわかれば良い.
- 1つの区間 における結果の計算方法
- の結果を利用して, の結果を高速に計算する方法
において, 整数 が 個あるとする. このとき, 条件を満たす の個数は
である (この値を とおく).
と や の差を調べる.
のように区間が広がる場合, 新たに加わるのが第 項する. このとき, の総和において, 足すべき項が変わるのは の場合であるから, にある の数を として,
となる.
のように区間が狭まる場合も同様に, 区間から外れるのが第 項する. このとき, の総和において, 足すべき項が変わるのは の場合であるから, にある の数を として,
となる.
このようにして Mo アルゴリズムによって, うまいこと区間を伸び縮みさせてその差分で結果を更新させていくことにより, 個の質問に対して, 時間で求めることができる.