アットウィキロゴ
競技プログラミング用 知識集積所
掲示板 掲示板 ページ検索 ページ検索 メニュー メニュー

競技プログラミング用 知識集積所

ABC457D - Raise Minimum

最終更新:

sport_programming

- view
管理者のみ編集可


問題


必要知識

B以下レベルの内容は省略

考え方

愚直にやるなら、毎回最小値を探してそこに操作をすることになる。
しかし、回数Kが最大10^18と多く、最小値を探すのも長さNの数列を全部見ていては、全く時間が足りない。
そこで高速化を考える。

問題は「最大値はいくつか?」だが、ひとまず「その値をXにできるか?」を考えてみる。
これは、各値ごとにX以上にするために必要な回数の総和を求めれば、O(N)で答えられる。
回数が非常に多いため、long long型でさえはみ出ることに注意。
K+1以上はどれだけ多くても意味がないので、大きくなり過ぎたらK+1に戻すとよい。

さて、「ある値の最大値(最小値)はいくつか?」という問題で、
  • 「その値をXにできるか?」がO(N)で解ける
  • その値をXにできるなら、X以下(以上)は絶対に全部できる
  • その値をXにできないなら、X以上(以下)は絶対に全部できない
の3つが成り立つ場合、二分探索※でO(NlogW)(Wは解としてありえる範囲)で間に合わせることができる。

この問題は、「数列の全ての値を基準値以上にできる、の基準値の最大値はいくつか?」という問題。
よって、「数列の全ての値を基準値以上にできる、の基準値をXにできるか?」と考えることでこれを適用できる。

解答例


注意点


別解

タグ:

二分探索
最近更新されたスレッド
ウィキ募集バナー