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

ABC409B - Citation

最終更新:

sport_programming

- view
管理者のみ編集可


問題


必要知識

A問題レベルのものは省略

考え方

条件を満たす最大値を答えるものなので、大きい方から順に全探索する。
答えの可能性があるのが0以上n以下の整数なので、nから順に下降方向へ1つずつ条件に合うか調べ、合うものを見つけた時点でループを抜ければよい。

解答例


注意点


別解

vectorを使って全部の個数を一気にカウントする

毎回個数チェックにループを回すのは計算時間がかかりそうなので、そこを高速化することができる。
Aの中身が10^9まであるので普通にやると計算量がとんでもないことになるが、nを超える値は全てn+1に書き換えてしまって問題ないことを使えば対応できる。

もっとも、これはB問題なのでこんなに苦労して高速化する意味は何もない。
もしこれがC問題だった場合、O(n)解法なのでN=10^8くらいでも対応できるという意味で知っておきたい解法ではある。
解答例

sortして答える

実はaの順番は無関係であると考えると、aが小さい順か大きい順に並んでいれば個数が数えやすいと判断できる。
毎回二分探索(未作成)するか、上手に前から順に判断していくか、どちらでも。
後者の場合、番兵法(未作成)の考えで最後に-1を足しておくとコードを書きやすい。

もっとも、これはB問題なのでこんなに苦労して高速化する意味は何もない。
もしこれがC問題だった場合、O(n*logn)解法なのでN=10^6くらいでも対応できるという意味で知っておきたい解法ではある。
解答例

タグ:

全探索
ウィキ募集バナー