はまやんはまやんはまやん

hamayanhamayan's blog

A or...or B Problem [AtCoder Grand Contest 015 D]

http://agc015.contest.atcoder.jp/tasks/agc015_d

解法

http://agc015.contest.atcoder.jp/submissions/1314294
考察パートが長い。
大切な事実は以下の通り

  • AとBのprefixが同じ部分は削除して考えて構わない。なので、数え上げをする前に同じprefixは消す、正規化をしておく
A = 1100101
B = 1110000
であれば、どうやってもできる数は11?????となるため、抜いて考えていい

こうすることで、最上位ビットが必ず異なるようにできる

  • A未満の数は作れない
  • 興味があるのは、10,100,1000のような数であり、これが登場すればそれ以降は組合せで作れる
0000
0001 <-
0010 <-
0011
0100 <-
0101
0110
大切なのはこの部分で、この3つがあれば、0000~0111は自由に作れる

大切な方針「A≦1000…≦Bな1000…をCとしておくと、[A,C]と(C,B]は分けて考える(変数line)。

  • まず、[A,C]はそのまま答えに突っ込んでおく
  • 次に、(C, B]の中で最大の100…を探す(変数line2)
  • 例えば、line2=1000であれば、0000~1111は作ることができることが分かる
  • あとは、それに加えて、[A,C]orCとすることで、より大きい数が作れる場合も答えに加えておく

これで答えが求まる。
A==Bのときとか、正規化したらA==0になっちゃったときの処理とかをこまごま書くとAC