ながめも

競技プログラミングについて

AtCoder Grand Contest B - Voting Judges

問題へのリンク

問題概要

問題が N問あり、 i番目の問題のスコアは A_iである。 M人が独立に V問選び、それらのスコアを 1ずつ上げる。 M人の選択後、スコアの降順に並べられ、最初の P問が採用される。採用される可能性のある問題は何問あるか?

制約

  •  1 \le N \le 10^{5}
  •  1 \le M \le 10^{9}
  •  1 \le V \le N-1
  •  1 \le P \le N-1
  •  1 \le A_i \le 10^{9}

解説

以降0-indexedとする。問題を降順ソートする。上からP-1問目を含む同率順位までは、必ず選ばれる。この境界を lとする。

今回、選ばれるかどうかの境界は、二分探索することができる。よって、問題 xが選ばれるかどうかを O(N)ほどかけて調べることを考えれば、問題を O(N\log{N})で解くことができる。

  •  x \le lの場合

 xは必ず選ばれる。

 M人が独立に V問選ぶ場合、一つの問題は最大で M回選ぶことが可能である。よって、 xは、必ず +Mされると仮定してよい。

  •  A_x + M \lt A_lの場合

どう選んでも A_xは上位 P問に入ることはできない。

  •  A_x + M \ge A_lの場合

選ばれる可能性があるかどうか判定したい。

  •  A_i \gt A_lなる iは、 +Mしてよい。 xが上位 P問に入ることができるかどうかに関係しないからである。

  • A_l \ge A_i \gt A_xなる iは、 A_x + Mを超えないところまで、つまり、 A_x + M - A_iだけ投票してよい。これ以上投票して A_x + Mを超えてしまうと、 xが上位 P問に入ることができなくなる。

  •  A_x \ge A_iなる iは、上位に影響しないので、 +Mしてよい。

これらの x が上位 P問になるために足していい数の合計が M * V以上あれば、 xは上位 P問になることができると言える。 M * V未満だと、足せなくて溢れた票が M回足されていない他の問題に流れ、 xが上位 P問に入れなくなる。

f:id:coonevo:20200406114429j:plain
sample 3