公式
E - Exchange or Not 解説
by
E - Exchange or Not 解説
by
confeito
\(i-1\) 番目までの操作列が一致している時、\(A_i\neq A_{i+1}\) なら \(i\) 番目で交換を行うか行わないかで \(A_i\) の値が変わるので、必ず別の数列が生じます。そうでなければ、操作を行っても行わなくても同じです。そのため、\(i-1\) 番目までの操作後に \(A_i=A_{i+1}\) となっている場合は操作をしないこととすると、ありうる操作列と操作後に生じる数列が一対一に対応します。
ここで、入れ替えない操作が発生した時点ごとに数列を区切ることを考えます。すると、許容される操作は、この区切られた各区間において、先頭の値が先頭以外で現れないようなものとなります。このように区間を区切る方法の総数を数え上げれば良いです。
これは、配る DP で解くことができます。\(dp[i]\) に、\(i\) 番目までの区間の区切り方の総数を記録することにして、\(i\) の昇順に \(dp[i]\) を計算します。\(A_i\) から区間が始まるとすると、その区間の終わりは初めて \(A_i\) と同じ値が現れる場所よりも左側までとしなければなりません。そのため、この区間に \(dp[i]\) を加算すれば良いです。累積和で管理すれば、 \(O(N)\) で答えを求めることができます。セグメント木や遅延セグメント木を使って \(O(N\log N)\) で求めることもでき、適切に実装すれば間に合います。
投稿日時:
最終更新:
