AtCoder Beginner Contest 155
D - Pairs
積が $x$ 未満となる組の個数 $f(x)$ を二分探索で求める関数を書き、これを元にして答えを二分探索。$O(N \log N \log \max_i A_i)$。想定は尺取り法で $O(N \log \max_i \vert A_i \vert)$ らしい。
思い付くためには、次のふたつを考えると楽:
- 入力 $A_i$ に負数が含まれるため難しい。ではすべてが非負だとすれば解けるか?
- $\frac{N(N-1)}{2}$ 個あるすべての組を考えるから難しい。では $A_1$ と $(A_2, A_3, \dots)$ のどれかという $N - 1$ 個の組だけでよければ解けるか?
機械解法
(1.) から (2.) への変形はちょっとギャップある。(2.) から (5.) まではやるだけ
- 問題文を翻訳: the $K$-th number of $\lbrace\lbrace A_i A_j \mid i \lt j \rbrace\rbrace$
- これは次を求めるのと同じだと見抜く: $\min \left\lbrace x \mid \unicode{35} \lbrace (i, j) \mid i \lt j \land A_i A_j \le x \rbrace \ge K \right\rbrace$
- 式変形: $\min \left\lbrace x \mid \sum_j \unicode{35} \lbrace i \lt j \mid A_i A_j \le x \rbrace \ge K \right\rbrace$
- 式変形: $\min \left\lbrace x \mid (\sum _ {A_j \ge 0} \unicode{35} \lbrace i \lt j \mid A_i \le x / A_j \rbrace) + (\sum _ {A_j \lt 0} \unicode{35} \lbrace i \lt j \mid A_i \ge x / A_j \rbrace) \ge K \right\rbrace$
- これは $O(N \log N \log \max_i \vert A_i \vert)$
E - Payment
下から桁DP。$O(\log N)$。
「$N$ の $i$ 桁目以下 (つまり $N \bmod 10^i$) をちょうど払うときの紙幣の枚数」および「$N$ の $i$ 桁目以下の補数 (つまり $10^i - (N \bmod 10^i)$) をちょうど払うときの紙幣の枚数」を同時に求める。 ここで補数が $10^i - (N \bmod 10^i) - 1$ ではないことに注意が必要。つまり最下位桁だけ特別扱いする。
漸化式が線形なので、$N$ の $10$ 進数展開が周期的だったなら行列累乗もできる。
E問題、お釣りを受け取らなければ答えは常に1なので、貧困が悪い。
— 宇宙ツイッタラーX (@kenkoooo) February 16, 2020
これすき
メモ
- D, E ともにバグらせた
- F は分からなかった (時間があれば嘘解法を無理矢理はあったかも?)