Construct the Binary Tree - #624 e div3

#tree

f:id:tac_12:20200226143351p:plain

一番浅い leaf とは, 5 のこと (root を除く)
上の図で, leaf で, 一番浅いのから上に上げる理由は, もともと chain で, 下の方が詰まりやすいから
一番右の図で, 4 を上げたら 2 の子が 3 つになる

親の親に移動するのではない

深さが 2 小さい頂点に移動する

親の親に移動するので WA になるケース
1
10 19

f:id:tac_12:20200226164925p:plain:w200
sample 2 で, 図のようになって終了し, NO となってしまう



コード
https://codeforces.com/contest/1311/submission/71919519

bad がいる理由

v を選ぶ時点では, 移動先を考慮しない
よって, v に移動先がないかもしれない

v に移動先がないのは, 親が 0 であるだけでない
sample 2 の上図で, 7 には移動先がない

一度移動先がなければ, 今後移動先はない
v の祖先の子ができるだけだから

計算量

d の条件
最大で, chain のとき
最小で, 根に近い頂点から子がちょうど 2 つあるような木

最小の方で, N = 5000 のとき 51822
d ≤ 5000 より, NO

だいたい N < 700 くらいである必要がある
while (cur > d) が 10^5 くらい
その中で O(N = 700)

あとは, 最小の方の求め方

頂点 1 では何も足さず, 頂点 2, 3 で 1 を足す
4 ~ 7 で 2 を足し, 8 ~ 15 で 3 を足す...

1, 4, 8, ... で足す数が 1 増える
if (!(i & (i - 1))) ++cd;