ABC217 参加記録
コンテスト中AC:A〜E
D - Cutting Woods
結合している座標情報を管理する場合、操作列を逆順にしてUnion-Findで結合していくなどが考えられます。しかし、なので、全ての座標を保持することはできません。
そこで、切られた座標を管理することを考えます。
のクエリが来た時、より左側及び右側で1番近いカット位置をそれぞれ、とします。
すると、が属する丸太の長さはとして求められます。便宜上、にもカットされているものとします。
順序付き集合はc++ならsetで値の挿入、log時間できます。の探索はupper_boundでlog時間でできます。(今回重複がないので、lower_boundでも可)
の探索は、各座標にマイナスをつけると同じように求められます。
提出コード:https://atcoder.jp/contests/abc217/submissions/25581002
E - Sorting Queries
ソート処理はなので、たくさん出てくると厳しいです。この部分を実際にソートせず処理できないか考えます。
一旦、ソートを挟むと、それまでの出現順は無視され、昇順に並んでいればよいことになります。
そこで、追加順に並んでいる配列と、昇順に並んでいる集合を別に管理することにします。
そうすると、ソート操作が来た時には、の先頭から値を全て取り出し、に追加します。
この操作は高々回しか起こらず、をsetにすれば挿入操作はlog時間です。
先頭の値を取り出す操作は、が空でないならから行い、空ならから行います。
以上で、ソート操作なしで、各クエリに答えることが可能になりました。
提出コード:https://atcoder.jp/contests/abc217/submissions/25587634