ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

Educational Codeforces Round 48 (Rated for Div. 2) D. Vasya And The Matrix

問題
提出コード

問題概要

n要素の数列aと、m要素の数列bが与えられます。
nm列の行列で、それぞれの行について、全要素のxorをとるとaに、それぞれの列について全要素のxorをとるとbになるようなものが存在するならば1つ求めてください。

解法

行う操作がxorなので、全要素を2進数の桁ごとに見て、最後に合算すればよいことがわかります。
ので、これ以降はa,bが0,1からなる数列で、行列も0,1からなるものを求めることだけを考えればよいです。
構築できない条件を探してみます。
0,1からなるということと、xorが絡んでいることから、偶奇に着目します。
すると、数列aの総和と、bの総和の偶奇が異なる場合、構築できないことがわかります。
数列aの各値は、その行に存在している値の総和の偶奇と一致するように構築する必要があります。ということは、aの総和は、行列の要素全てに対する総和の偶奇と一致しているはずです。
このことはbにも同様のことが言えます。
よって、行列全体の総和の偶奇は、aの総和の偶奇と一致していて、かつ、bの総和の偶奇と一致している必要があります。
ということで、aの総和とbの総和の偶奇が一致しない場合には構築できないことがわかりました。
では、一致している場合には構築できるかどうか、を見ていきます。
わかりやすく、aの総和の偶奇で場合分けをします。

  • aの総和、bの総和が奇数の場合
    これはすごくシンプルで、(i,j)の値を決める場合、a_{i} = b_{j} = 1であれば1、それ以外なら0とすればよいです。
    a_{i},b_{j}の要素が1の際、その行(列)で1となっている要素の個数が奇数個になっている必要がありますが、a,b1となっている要素の個数が奇数個であるため、上記のような構築をすればよいです。

  • aの総和、bの総和が偶数の場合
    この場合は少々厄介です。
    単純な構築ができなかったため、どこかに値を押し付けて、最後に微調整を加えることを考えます。
    すると、
    (1,b_{i})を、b_{i}と一致させる
    (a_{i},1)を、a_{i}と一致させる
    とすると、a_{1},b_{1}以外はうまく構築できます。
    あとは最後に微調整をすればよく、(1,1)a_{1} \ xor \ b_{1}とすればよいです。

    感想

    こんな構築もあるみたいです。すごい。