fuu32のブログ

精進記録

第5回 ドワンゴからの挑戦状 予選 B - Sum AND Subarrays

問題概要

B - Sum AND Subarrays

数列aの空でない連続する部分列の美しさは \sum_{i=l}^r a_i で決まり、 N(N+1)/2 個存在するすべての部分列から K個取ってきてそれらの美しさのビット毎の論理積を取った時の最大値を求める。

制約

 2\leq  N  \leq 10^{3}
 1\leq a_i  \leq10^{9}
 1\leq K \leq N(N+1)/2
入力はすべて整数

考えたこと

最大値を求めたいのでできるだけ上位のビットを残したいという気持ちにはなる。 なので上位のビットからみていき、部分列の美しさのうち今注目しているビットが立っている部分列の美しさがK個以上あるならばそれらを新たな集合とみなし、次一つ下のビットを見るときには新しい集合に属する値のみについて同じように調べていけばいい。
サンプル1を例に挙げる。部分列全体の集合をSとするとS=\{2,2,5,5,7,7,7,9,12,14\}でありそれぞれ二進数にすると以下のようになる。

美しさ  ビット列 
14 0000001110
12 0000001100
9 0000001001
7 0000000111
7 0000000111
7 0000000111
5 0000000101
5 0000000101
2 0000000010
2 0000000010

今下から4ビット目について調べているとすると、4ビット目のビットが立っているのは\{14,12,9\}でありこれをS'とする。 S'は3つの要素からなり、 K \leq |S'| が成り立つので変数ansの下から4ビット目を1にし、次に下から3ビット目を調べるときは集合S'の要素についてのみ調べればいいことがわかる。

こんなことを上位ビットから下位ビットにかけてやっていけば良い。 最終的に残った集合の要素数K個以上の場合もありうるがそのうちK個どの組み合わせで選んでも、最大値は変わらないので問題ない。

部分列の美しさの最大値は10^{3} \cdot 10^{9} = 10^{12} < 1099511627776 = 2^{40}なので下から40ビット目からみていけばいい。

提出コード:Submission #3660941 - Dwango Programming Contest V / 第5回 ドワンゴからの挑戦状 予選

解くべき問題を解いてレートを上げたいです。