コンテスト中AC:A〜C,E
コンテスト後、Dは自力AC
2022/07/06追記
Eの実装に単射や同値類という記載がありますが、誤りです。
無視してください。
D - Sequence Query
実装が複雑になりましたが、自作双方向連結リストでACしました。
- 出現した整数の昇順ソートされた順序集合
(set)
- 初めて出現した整数が双方向連結リストに何番目に挿入されたかを記録するハッシュマップ
(unordered_map)
- 双方向連結リスト
を準備します。
それぞれにあらかじめ、を入れておきます(番兵)。
には昇順に値が挿入されていくように処理します。
具体的には、番目のクエリは以下のように処理します。
クエリ1 x
が
に初めて挿入される場合、
に
の何番目に挿入されたかを記録する。
より大きい最小の整数
を
から二分探索で得る。
が
の何番目に挿入されたかを
から得る。これを
番目とする。
において、
番目に挿入された値(
)の後ろに
を挿入する。
クエリ2 x k
より大きい最小の整数
を
から二分探索で得る。
が
の何番目に挿入されたかを
から得る。これを
番目とする。
において、
番目に挿入された値(
)から後ろに
回辿る。この時、途中または最後に
にたどり着いた場合、-1とする。そうでない場合、辿った先を答えとして出力する。
クエリ3 x k
より大きい最小の整数
を
から二分探索で得る。
が
の何番目に挿入されたかを
から得る。これを
番目とする。
において、
番目に挿入された値(
)から前に
回辿る。この時、途中または最後に
にたどり着いた場合、-1とする。そうでない場合、辿った先を答えとして出力する。
multisetを使うとイテレータの増減だけでいいようです。今更ながら勉強になりました。
E - Putting Candies
に移動すると考えます。
常に移動先は同じなので、鳩の巣原理によって、多くとも回くらい移動すると、同じ場所が2回現れ、その後ループします。
あとは、回の移動で何回iから移動するかをカウントすれば答えを計算できます。
それを自作ライブラリ化してあったので、よければ参考にしてください。
実装はコンテスト後に少し修正してあります。
なお、この問題は各頂点が有向辺を1つだけもつグラフとも捉えられます。
そのようなグラフは閉路を1つだけ持ち、すべての頂点は閉路に属するか、閉路へ向かうように向きづけられています。
(ここで一応証明してみてあります。AtCoderの過去問の記事なのでネタバレ注意)