Codeforces 305C

問題

n個の非負の整数a1,a2,...,anが与えられる。
これを2^a1,2^a2,...と書き直して総和を求める。
これに2^b(b>=0)形式のものをいくつか加えて、その総和が2^{v}-1(vは任意)になるようにしたい。
いくつ加えればよいか。


1<=n<=10^5
0<=a_{i-1}<=a_i<=2*10^9

考え方

各ビットで考えられる。

a_iが来るたびに、以下を処理。メモはmapなどで。(ただし適時処理が終わったビットやビットが0のものをeraseしないと木が大きくなってTLEする。)

・a_iとa_{i-1}が違う場合
a_{i-1}からa_iまでの間にあるビットが0のものを数え上げる。


・a_iとa_{i-1}が等しい場合
桁の繰り上げが発生するので、繰り上がる桁をメモしておく。



最後に、a_n以上のビットで、最大のビットまででビットが0のものを数えればよい。(数えるべき桁数からビットが1のものを引いて求める。)

Editorial

2分探索らしい。
http://codeforces.com/blog/entry/7712