J - 一流の団子職人 (Super Dango Maker) Editorial by Mitsubachi

別解

別解を説明します。小課題4だけ説明します。
$f(m)$ を $m$ 串作れることが分かっている $Nm$ 個の団子から $m$ 串を特定するために十分な Query の回数として、 $f(25) \leq 50000$ となるような戦略を立てたいです。

$l= \lceil \frac{m}{2} \rceil , r = \lfloor \frac{m}{2} \rfloor$ として、ちょうど $l$ 串を作れる $Nl$ 個の団子と残り $Nr$ 個の団子に分けることを考えます。
含まれている団子の番号の配列を持つとして、二分探索で配列の $1$ 番目から $x$ 番目で $l$ 串作れるという最小の $x$ を求めて、そこから $1,2,3, \cdots , x$ の順にこの団子を外しても $l$ 串作れるかを見て、実際大丈夫なら外すという処理をすると $\lceil \log_{2}(Nm) \rceil + Nm$ 回以下で条件を満たす $Nl$ 個の団子を特定できます。
よって $f(m) \leq f(l)+f(r)+ \lceil \log_{2}(Nm) \rceil + Nm$ が成立して、 $f(1)=0$ のため、これに基づくと $f(25) \leq 47490$ が得られるので、間に合います。

実装の際は未決定の番号のリストを管理してあげる再帰実装をすると楽です。

posted:
last update: