ABC149 E - Handshake
解法
明らかに、得点の和が高いペアから順番に握手をしていくのが最適です。
ある得点が達成できるとすると、明らかに未満の任意の得点は、全く同じ手を選ぶことで達成でき、達成できないときは以上の得点はどう頑張っても達成できないので、
- 以上の得点を達成できるか
について単調性が存在します。
このについて二分探索をしたいのですが、うまくいきません(僕はいきませんでした)。ので、少し見方を変えます。
得点の和が高いペアから順番に握手をしていくのが最適だったので、ある得点について、
- 以上となるペアについては握手を行い、未満となるペアについては握手をしない
という区切り目が存在するはずです。
以上となるペアの個数が個以上になると、回握手することができます。
以上となるペアの個数についても、が減少すれば個数が増加し、単調性が存在しています。ので、
- 以上となるペアの個数が以上になる
ような、最大のを二分探索で求めることができます。
すると、その以上のペアの総和を求めればよいです。
片手がのとき、もう片方の手は、以上のを選ぶことができます。このの個数は、が降順ソートされていれば、二分探索で求めることができます。
これにより、ペアの個数を求めることができました。
総和についてもほぼ同様で、からまでの総和と、の総和を全てのについて足したものになります。
これは、後者についてはそのまま個数をかければよく、前者については累積和をあらかじめ計算しておくことで、高速に計算することができます。
あとは、コーナーケースである、
- 以上となるペアの個数がぴったりではなかった場合
についての差分を計算すればよいです(サンプル2参照)。
得点の和が以上となるペアは個未満になってしまうはずなので、今以上となるペアの個数が個あるとしたときに、総和から除くべき個のペアは、得点がとなっているものについてです。
ということで、を、全体の総和から引いてあげれば求める答えとなります。
感想
見るからに二分探索をしたいなぁ、と思っていたのですが、うまく二分探索をする方法を考えるのに詰まってしまいました。
見方の変え方が課題です。