ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC091 C - 2D Plane 2N Points

問題
提出コード

解法

2次元のままこの問題を考えると、いろいろと大変なことになるので、どちらか片方の条件を無視してよくなるような条件を探します。
すると、赤の点と青の点を同時にxの昇順、yの昇順の優先度でソートを行うと、i番目の赤い点と、j番目の青い点について、i \lt jが成立しているときに、xについては常に条件を満たすようになります。
ということで、この後は次のような問題に置き換えることができます。

  • i \lt jかつ、y_{i} \lt y_{j}となる赤い点iと、青い点jのペアの個数の最大値はいくつか。

制約を見ると、点の個数はとても少ないので、探索にそこそこ時間をかけても大丈夫です。
ということで、上のソート済みの数列に対して前から順番に見ていき、次のような操作をします。

  • 次に見る点iが赤い点だった場合
    別のリストに、赤い点を記録していく。

  • 次に見る点jが青い点だった場合
    赤い点を記録したリストをyについて昇順にソートしなおし、y_{j}より小さいy_{i}のうち、y_{i}が最大となっている点を二分探索で調べる。その点と、jをペアにする(リストからiの点を消す)。


xが小さい順に青い点を持ってきたときに、まだペアになっていないかつ、今見ている青い点とペアを組める赤い点のなかから1つペアを組むとしたら、組める中でyが最も大きいものを選んだ方が得になるので、青い点を取ってくるたびに二分探索でそのような点を探します。
ということで、これを繰り返し、完成したペアの個数が答えになります。

感想

これ、400点にしても難しい気がします…
たしかにやっていること自体は400点っぽい内容なのでなんともいえないです。
初見のときは解けなかったのですが、今回もかなり時間がかかりました。完全に点の個数が10^{5}ぐらいあると思っていたので、ソートした後どうやってペアをつくればいいかずっと悩んでいました。