Official

E - メッセージの伝達 / Message Delivery Editorial by harurun4635


問題を整理します。

以下のように \(\operatorname{score}\) を定義します。

各頂点 \(i\) に値 \(V_i\) のコマがあります。

Functional Graph \(A\) に沿ってコマを \(K\) 回移動させ、各頂点に集まったコマの値の XOR をその頂点の値とします。 全頂点の値の総和を \(\operatorname{score}\) とします。

高橋君が \(A\) を決めた後、青木君が \(1\) つの \(V_i\) を任意の非負整数に変更します。高橋君は \(\operatorname{score}\) を最大化し、青木君は最小化します。\(\operatorname{score}\) はいくつになりますか?


高橋君は任意の集合分割 \(P\) を実現できます。各集合 \(X\in P\) について代表元 \(p\in X\) を選び、すべての \(i\in X\) に対して \(A_i=p\) とすればよいです。最終的な値は \(\displaystyle \bigoplus_{i\in X}V_i\) となります。

青木君は、ある集合 \(X\) の要素 \(p\) を選び、 \(\displaystyle V_p\gets V_p\oplus\bigoplus_{i\in X}V_i\) とすることで、その集合の XOR を \(0\) にできます。したがって、分割 \(P\) が決められれば、\(\operatorname{score}\)

\[\sum_{X\in P}\left(\bigoplus_{i\in X}V_i\right) - \max_{X\in P}\left(\bigoplus_{i\in X}V_i\right)\]

です。


各要素を単独の集合とすれば、

\[\sum_{i=1}^N V_i-\max_i V_i\]

を実現できます。

一方、他のどの分割でも 、この値以下であることが示せます。\(V_p=\max_i V_i\) とし、青木くんが「 \(V_p \gets 0\) とした」とします。

このとき、 \(\operatorname{score}\)\(p\) を取り除いた \(N-1\) 要素の集合 \(P'\) を用いて、\(\displaystyle \sum_{X\in P'}\left(\bigoplus_{i\in X}V_i\right)\) と書けますが、これは三角不等式 \(X \oplus Y \le X + Y\) より明らかに \(\displaystyle \sum_{i \in P'} V_i\) 以下です。

よって、答えは \(\sum_{i=1}^N V_i-\max_i V_i\) です。


実装例

n, k = map(int, input().split())
v = list(map(int, input().split()))
print(sum(v) - max(v))

posted:
last update: