X 回の操作で目的が達成可能かどうかを考えると「根以外の葉を全て削除する」操作を X 回行った後に残っている根以外の頂点が X 個以下であれば達成可能であることがわかります。
頂点を削除する回数は最大でも N−1 回なのでそれぞれの削除を高速に行えれば一連の操作をシミュレーションすることでこの問題に正答できます。
頂点 i の子の個数 Ci と残っている根以外の頂点数 remを保持し、以下のように実装するとよいです。
- queue(stackでもstd::vectorでもいいです)を用意し、Ci=0 となる i を全て挿入する。また、 rem:=N−1 とする。
- ans=1,2,… について昇順に以下の操作を行う。
- queueに含まれる全ての i について、頂点 i を削除して CPi:=CPi−1 とする。
- rem≤ans となった場合は答えとして ans を出力して終了する。
- 上で CPi=0 となった Pi を記憶しておき、改めてqueueに挿入する。
また、結果としては変わりませんが X について二分探索を行っても構いません。
余談
当初の間違っていたwriter解を正当にするために設定を捻じ曲げた問題があるのでよければそちらも解いてみてください!