きろく

特筆すべき記録のまとめ

Dwango Programming Contest V / 第5回 ドワンゴからの挑戦状 予選:B - Sum AND Subarrays

問題

beta.atcoder.jp

解法

2^31 の位から 2^0 の位の順に答えを決定していくことを考える.なぜならば,2^k の位が 1 にすることが可能であるならば,2^k の位をパスしより小さい位で 1 としたとしても答えを 2^k の位を 1 としたときよりも必ず小さくなってしまうから.

このことを踏まえて,N(N + 1) / 2 個の部分列を見る.k = 63 ~ 0 (なぜ 63 なのかは後述)とするとき,もし,部分列の中で 2^k の位の bit が 1 であるものが K 個以上あるならば,その K 個以上のもの以外は答えに関係しないので,K 個選ぶ候補から外す.反対に,その K 個以上のものを K 個選ぶ候補に新しくする.K 個以上ない場合は,候補をそのままにする.これを全ての k について調べ,最終的に残った候補の AND を取れば答えになる.O(63 * N^2).

解答

beta.atcoder.jp

なぜ k が 63 ~ 0 なのかというと,制約から Amax * (Nmax)^2 = 10^15 となり,2^32 の位から調べ始めるのでは対応できないから.このことが原因で WA を連発してしまった.

f:id:babcs2035:20181124220302p:plain