AtCoder Beginner Contest 260 D問題 Draw Your Cards
問題
提出解答
問題の概要
から までの整数が書かれたカードが1枚ずつ計 枚あり, 裏向きで1つの山に積まれている. 上から 番目のカードに書かれているカードは である.
次の操作を 回行う.
- 山札の一番上のカードを引き, 表向きにする. このカードにかかれている整数を とする.
- 場に見えているカードのうち, 以上のカードが存在すれば, 以上の最小の整数が書かれているカードの上にそのカードを重ねる. もし, 存在しなければ, どのカードにも重ねずに置く.
- その後, 表向きのカードが 枚重なった山があれば, その山にあるカードを全て食べる.
それぞれのカードについて, 食べられることはあるか? あるならば, それはいつか?
制約
- は の並び替え.
解法
次の操作が高速にできるデータ構造 を利用する必要がある.
- に要素 を追加/削除する.
- にある 以上の整数で最小の要素を見つける.
このデータ構造 としては, 例えば, 順序付き集合や BIT 木を利用することにより可能にする. 以下, はそのようなデータ構造とする.
表向きに見えているカードを記録するデータ構造として を利用する. また, と書かれた整数があるカードがある山にある一番下にあるカードに書かれている整数を表す変数を とし, を満たすような整数 のリストを で表すとする.
- の順に以下を処理する.
- に 以上の要素が存在する場合, にある 以上の最小の要素を とし, から を削除する. その後, とする.
- に 以上の要素が存在しない場合, とする.
- に を追加する.
- の長さが であるとき, から を削除し, の各項に答えが であることを記録する.
これにより, 計算量 で求めることができた.