西瓜の備忘録

競プロとかで気づいたこととか考察を書き留めるためのブログ

天下一プロコン2017 D

天下一プロコンは調子乗ってBeginnerじゃないほう参加したら見事に爆死しました

 

Cはともかく、Dは自力で解けなかったので解法をメモ

 

tenka1-2017.contest.atcoder.jp

問題概要:N個の非負整数がある それぞれの値と価値はAi,Biである

Aiの任意の組み合わせの論理和がK以下となるようにしたとき、最大の価値の総和を求めよ

制約:

1 ≤ N ≤ 10^5

0 ≤ K ≤ 2^30

0 ≤ Ai ≤ 2^30(1≤i≤N)

1 ≤ Bi ≤ 10^9(1≤i≤N)

まず制約からして全探索、BitDPは不可能

bitwise orの特徴は A∨B = A ⇔ AはBの立っているビット全て立っている

なのでK以下の値に対してAiが含まれるかどうかを判定して、含まれている場合価値の和を取ればよさそう

次にK以下の値の取り方を考える 

論理和は0→1はあっても1→0という値の変化はしないため、Kに立っていないビットを取るようなK'(<K)を取れば全ての値をカバーできるはず

K'の取り方はKの立っているビットを下から探して、そのビットを0にした後に以下の桁を全て1で埋めれば良い

この方法だと計算量はO(NlogK) ただしK=0の場合があるので注意