AtCoder Beginner Contest 260 E問題 At Least One
問題
提出解答
問題の概要
以下を満たす の連続部分列の個数を それぞれの場合について求めよ.
- 任意の に対して, その連続部分列は または を含む.
- 長さが
制約
解法
上の条件を条件 (A) と呼ぶことにする.
連続部分列の末項で場合分けする. 末項が であるような連続部分列のうち, が条件 (A) を満たすための必要十分条件は を
としたとき, である. 従って, としたとき, 末項が である連続部分列では長さ 以上 以下の連続部分列は条件 (A) を満たし. 条件 (A) を満たすのはこれに限る.
従って, 各 を固定するごとに, 条件 (A) を満たす長さは区間であるから, 区間加算ができるようなアルゴリズムを利用する. そして, 区間加算を全て終えた後に結果を得るということから, 使うアルゴリズムとして Imos 法がある.
また, 各 を求める際, 各 は高々2回しか変わらないことに着目すると, セグメント木を利用し, 1点更新で を更新していくことにより, における を合計 で求めることができる.
以上から, セグメント木と Imos 法を利用することにより, それぞれの長さで条件 (A) を満たすような連続部分列の個数を求めることができ, 計算量 である.