geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

ABC217 参加記録

コンテスト中AC:A〜E

 

D - Cutting Woods

結合している座標情報を管理する場合、操作列を逆順にしてUnion-Findで結合していくなどが考えられます。しかし、L \geq 10^9なので、全ての座標を保持することはできません。

そこで、切られた座標を管理することを考えます。

 

c_i = 2のクエリが来た時、x_iより左側及び右側で1番近いカット位置をそれぞれl_ir_iとします。

 

すると、x_iが属する丸太の長さはr_i - l_iとして求められます。便宜上、0,\ Lにもカットされているものとします。

 

順序付き集合はc++ならsetで値の挿入、log時間できます。r_iの探索はupper_boundでlog時間でできます。(今回重複がないので、lower_boundでも可)

 

l_iの探索は、各座標にマイナスをつけると同じように求められます。

提出コード:https://atcoder.jp/contests/abc217/submissions/25581002

 

E - Sorting Queries

ソート処理はO(NlogN)なので、たくさん出てくると厳しいです。この部分を実際にソートせず処理できないか考えます。

 

一旦、ソートを挟むと、それまでの出現順は無視され、昇順に並んでいればよいことになります。

 

そこで、追加順に並んでいる配列Bと、昇順に並んでいる集合Sを別に管理することにします。

そうすると、ソート操作が来た時には、Bの先頭から値を全て取り出し、Sに追加します。

 

この操作は高々Q回しか起こらず、Sをsetにすれば挿入操作はlog時間です。

 

先頭の値を取り出す操作は、Sが空でないならSから行い、空ならBから行います。

 

以上で、ソート操作なしで、各クエリに答えることが可能になりました。

提出コード:https://atcoder.jp/contests/abc217/submissions/25587634