ツバサの備忘録

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

ABC149 E - Handshake

問題
提出コード

解法

明らかに、得点の和が高いペアから順番に握手をしていくのが最適です。
ある得点Xが達成できるとすると、明らかにX未満の任意の得点Yは、全く同じ手を選ぶことで達成でき、達成できないときはX以上の得点はどう頑張っても達成できないので、

  • X以上の得点を達成できるか

について単調性が存在します。
このXについて二分探索をしたいのですが、うまくいきません(僕はいきませんでした)。ので、少し見方を変えます。
得点の和が高いペアから順番に握手をしていくのが最適だったので、ある得点Pについて、

  • P以上となるペアについては握手を行い、P未満となるペアについては握手をしない

という区切り目が存在するはずです。
P以上となるペアの個数がM個以上になると、M回握手することができます。
P以上となるペアの個数についても、Pが減少すれば個数が増加し、単調性が存在しています。ので、

  • P以上となるペアの個数がM以上になる

ような、最大のPを二分探索で求めることができます。
すると、そのP以上のペアの総和を求めればよいです。
片手がA_{i}のとき、もう片方の手は、(P-A_{i})以上のA_{j}を選ぶことができます。このA_{j}の個数は、Aが降順ソートされていれば、二分探索で求めることができます。
これにより、ペアの個数を求めることができました。
総和についてもほぼ同様で、A_{1}からA_{j}までの総和と、A_{i}\times(選べるA_{j}の個数)の総和を全てのiについて足したものになります。
これは、後者についてはそのまま個数をかければよく、前者については累積和をあらかじめ計算しておくことで、高速に計算することができます。
あとは、コーナーケースである、

  • P以上となるペアの個数がぴったりMではなかった場合

についての差分を計算すればよいです(サンプル2参照)。
得点の和がP+1以上となるペアはM個未満になってしまうはずなので、今P以上となるペアの個数がM+q個あるとしたときに、総和から除くべきq個のペアは、得点がPとなっているものについてです。
ということで、Pqを、全体の総和から引いてあげれば求める答えとなります。

感想

見るからに二分探索をしたいなぁ、と思っていたのですが、うまく二分探索をする方法を考えるのに詰まってしまいました。
見方の変え方が課題です。