人間だけど競プロやる

解けなかった問題を理解できたら記事を投稿します。日本語の解説が見つからなかったもの中心。

Codeforces Round #682 (Div. 2)


怒涛のギャグ問題回。

A. Specific Tastes of Andre

ギャグ問題。
部分列の和が、長さで割り切れるといっているので、部分列の和と長さが等しければ常に条件を満たすことは自明。
よって全部を1にすれば、どの部分列をとっても、和と長さが等しくなる。

B. Valerii Against Everyone

ギャグ問題2。
すべての要素は 2^N なので2つの部分列の和が等しいということは、2進数でみて、ビットがたっている場所が等しいことになる。
ただし、各要素が2^Nなので、2進数で表現したときに、一つの桁に「1」が足されることになる。
これをよく考えると、和が等しくなるのは、たとえば、「A=10110b」と「B=10100b」があったとき、Bに「10b=2^1」が足される(二桁めに1が足される)という状況になるが、遡って考えると、一つの要素によって
一つの桁(とその繰り上がり)しか変化しないので、Aが「10110b」となるために、「10b」か「1b+1b」のどちらかがあったことにる。
「10b」があったなら、Bにたす「10b」と一致するので範囲の長さを1にすれば、この2つで和が一致する。
「1b+1b」があったなら、その時点で同じ値があるので、長さ1の部分列をとれば和が一致する(繰り上がりが発生するならその時点で和が一致する)。
結局、部分列の和が一致する状況が起こるなら、わざわざ過程の和を考えなくても、「同じ値が存在する」ことになる。
よって「同じ値が存在するか」で判定か可能となる。

C. Engineer Artem

かるくギャグ問題。
「+1」するか「そのまま」か、で四方が同じ値にならないので、仮にギリギリの値でテーブルを埋めるとすると、市松模様となる。
ここで市松模様を「0」と「1」で書いてみると解法が見える。
結局「+1」する「そのまま」で「0」と「1」の市松模様をつくるということは、「0」の場所を偶数「1」の場所を奇数にすることと対応する(逆でもいい)。 「+1」するのと「そのまま」で偶奇をコントールできるので、常に解が存在して構築できる。

D. Powerful Ksenia

よくわからない問題。
いろいろ試すとNが奇数なら常にYESになることがわかる。
具体的に考える。
A=[a,b,c,d,e,f,g]とする。B=a \oplus b \oplus c, として、
A=[B,B,B,d,e,f,g] C=d  \oplus e  \oplus fとして、
A=[B,B,B,C,C,C,g] C  \oplus  C  \oplus  B=Bより、
A=[B,B,B,B,B,C,g] D = B  \oplus C  \oplus gとして、
A=[B,B,B,B,D,D,D] B  \oplus  B  \oplus  D = Dより、
A=[D,D,D,D,D,D,D] となる。
ここで、abcdefgはどんな値でも良いので、少なくともN=7であれば常に成り立つことがわかる。
また、D=   B  \oplus C  \oplus g = a \oplus b \oplus c  \oplus e  \oplus f \oplus g なので、なんとなく奇数ならAの全要素のxorをとった値で一致しそうだとわかる。
重要なこととして、X  \oplus   X  \oplus  Y =Yとなることと、3つえらんでxorをとって同じ値にするので、一回の操作で同じ値がみつできることがある。
一回の操作で同じ値が3つできるので、それを連鎖させていくことを考える(要素をDに一致させたいので、すべての要素をxorで連鎖させていくイメージ)
A=[a,b,c,d,e,f,g]として
A=[B,B,B,d,e,f,g] C=B \oplus d \oplus eとして、
A=[B,B,C,C,C,f,g] D=C \oplus f \oplus gとして、
A=[B,B,C,C,D,D,D] E=D \oplus B \oplus B=Dとして、
A=[D,D,C,C,D,D,D] F = D \oplus C \oplus C=Dとして、
A=[D,D,D,D,D,D,D]
この操作はNが奇数であれば常に成り立つ。
(感覚的には、二個ずつ連鎖していって二周するとちょうど2 \times N消費できる(停止位置は最後尾の3つ前=N-2回操作後=全要素をAの累積xorにしたいから)。Nが偶数のときに失敗するのは、二週目に入ったときに一周目と同じ位置にきて、xorが連鎖しないから。)
X \oplus  X \oplus  X=Xより停止位置はN回操作後でも問題はない)
(別の見方として、3つの違う値が2つの同じ値に、2つの同じ値と1つの違う値が3つの同じ値になるから、最後には「BBBBBB...BC」-> ... ->「CCCCCC...C」となる(fig.1))

f:id:bqn2:20201115122705p:plain
fig.1

次に偶数を考える。
Nが奇数では成り立つことがわかっているので、N-1要素の奇数部分はすでに一致していると考えると、
A=[B,B,B,B,B,B,B,z]という状況になる。
ここで操作を繰り返せると仮定してさらに操作を繰り返すと、
A=[B,z,z,z,z,z,z,z]となる
よって、B=zのときのみ、すべてを一致させることができるとわかる(そうでなければこの2つの状態の行ったり来たりを繰り返すだけなので)。
またB=zよりB \oplus z = 0となり、BはN-1要素の累積xorだとわかっているので、結局A全体の累積xorが「0」のときのみ成立するとわかる。