第5回 ドワンゴからの挑戦状 予選 B - Sum AND Subarrays
問題概要
数列の空でない連続する部分列の美しさは で決まり、個存在するすべての部分列から個取ってきてそれらの美しさのビット毎の論理積を取った時の最大値を求める。
制約
入力はすべて整数
考えたこと
最大値を求めたいのでできるだけ上位のビットを残したいという気持ちにはなる。
なので上位のビットからみていき、部分列の美しさのうち今注目しているビットが立っている部分列の美しさが個以上あるならばそれらを新たな集合とみなし、次一つ下のビットを見るときには新しい集合に属する値のみについて同じように調べていけばいい。
サンプル1を例に挙げる。部分列全体の集合をとするとでありそれぞれ二進数にすると以下のようになる。
美しさ | ビット列 |
---|---|
14 | 0000001110 |
12 | 0000001100 |
9 | 0000001001 |
7 | 0000000111 |
7 | 0000000111 |
7 | 0000000111 |
5 | 0000000101 |
5 | 0000000101 |
2 | 0000000010 |
2 | 0000000010 |
今下から4ビット目について調べているとすると、4ビット目のビットが立っているのはでありこれをとする。 は3つの要素からなり、が成り立つので変数ansの下から4ビット目を1にし、次に下から3ビット目を調べるときは集合の要素についてのみ調べればいいことがわかる。
こんなことを上位ビットから下位ビットにかけてやっていけば良い。 最終的に残った集合の要素数が個以上の場合もありうるがそのうち個どの組み合わせで選んでも、最大値は変わらないので問題ない。
部分列の美しさの最大値は<なので下から40ビット目からみていけばいい。
提出コード:Submission #3660941 - Dwango Programming Contest V / 第5回 ドワンゴからの挑戦状 予選
解くべき問題を解いてレートを上げたいです。