Strorkisのブログ

信憑性については悪しからず

ABC117D - XXOR

問題

D - XXOR

解法

2進数での各桁 iにおける f(X)は、各 A_{i}の中で桁 iが0である個数と1である個数の多い方を 2^{i}にかけることで求めることができる。

ここでネックとなるのが K以下という条件だが、これは桁DPを考えれば良い。
つまり、上位の桁から、 K未満が確定している場合と Kと途中まで一致している場合に分けて処理するということである。
 K未満が確定している場合については愚直に遷移すれば良いが、 Kと途中まで一致している場合については、 K i桁目が1のとき、 X i桁目を0にすれば K未満が確定している場合へ遷移できることを考慮する必要がある。

計算量は、 O(Nlog(max(K, A_{max})))となる。

コード

Submission #11232446 - AtCoder Beginner Contest 117

感想

DPの考え方が浅かったためACできず、解説を見てしまった。
ただ、その戒めとして記事を書いたので、次回以降解けるようになっていることを願う。