Official

C - Even Sum Triplet Editorial by chinerist


操作として考えられるのは奇数 \(2\) 項、偶数 \(1\) 項に対する操作と 偶数 \(3\) 項に対する操作の \(2\) 種類です。数列に対して前者の操作を行えるかどうかは操作の前後で変化しないので、\(A,\ B\) で一致することが必要です。

[1] \(A,\ B\) いずれも奇数の項に対する操作が不可能である場合

この場合、奇数の項は操作によって変化することがないので \(A,\ B\) で一致することが必要です。一致する場合、操作を考える際は数列を奇数の部分で分割してよく、すべての項が偶数のケースに帰着できます。

すべての項が偶数の場合、数列の長さが \(3\) 以上であれば任意の位置で隣接swapすることができます。よって

  • 数列の長さが \(2\) 以下のとき、\(A,\ B\) が完全一致しているならば Yes 、していないなら No
  • 数列の長さが \(3\) 以上のとき、\(A,\ B\) が多重集合として一致しているならば Yes 、していないなら No

という風に判定できます。

[2] \(A,\ B\) いずれも奇数の項に対する操作が可能である場合

操作は可逆( \(X\)\(X'\) に変化させた後 \(X\) に戻せる)ので、\(A,\ B\) に対して操作を行うことで同じ数列にできないかを考えればいいです。

まず奇数をはじめの数項にまとめることを考えます。 \(A_i, A_{i+1},\ \dots, A_{i+k-1}\ (2 \leq k)\) が奇数であり、\(A_{i+k}\) が偶数のとき、操作を繰り返すことで \(A_{i+k},\ A_i,\ A_{i+1},\ \dots,\ A_{i+k-1}\) の順に並べ替えることができます。このように奇数が \(2\) 個以上連続している部分と偶数を入れ替えることを繰り返すことで奇数をはじめの数項にまとめることができます(初期状態で奇数が \(2\) 項連続している部分がない場合ですが、奇数の項を含む操作を \(1\) 回行うことで作ることができます)。

奇数、偶数の項を分離させた後、奇数の項をソートできないか考えましょう。例えば \(A_1,\ A_2,\ \dots,\ A_k\) が奇数で \(A_{k+1},\ A_{k+2},\ \dots,\ A_N\) が偶数のときに \(A_i,\ A_{i+1}\ (i < k)\) をswapできるかを考えます。これは \(A_{k-1},\ A_{k},\ A_{k+1} \rightarrow A_{k-1},\ A_{k+1},\ A_{k}\) という風に偶数 \(A_{k+1}\)\(1\) 項ずつ左によせて \(A_{i},\ A_{i+1},\ A_{k+1}\) という並びを作った後、\(A_{i},\ A_{i+1},\ A_{k+1} \rightarrow A_{i+1},\ A_i,\ A_{k+1}\) と操作して \(A_{k+1}\) をもとの位置に戻せばできます。よって奇数の隣接swapが任意の位置で可能であるため、奇数の項をソートすることができます。また、偶数の項については \(3\) 項以上あれば任意の位置で隣接swapができ、ソートができます。偶数が \(2\) 項である場合は両方に対し同時に操作することはできないので、位置を入れ替えることはできません。

以上より

  • \(A,\ B\) に含まれる偶数が \(2\) 個でないとき、 \(A,\ B\) が多重集合として一致していれば Yes 、していなければ No
  • \(A,\ B\) に含まれる偶数が \(2\) 個のとき、 \(A,\ B\) が多重集合として一致しており、\(2\) 個の偶数の順番が一致していれば Yes 、していなければ No

と判定できます。

奇数の項に対する操作が可能かの判定、多重集合の一致判定はそれぞれ \(O(N),\ O(N\log N)\) ででき、十分高速です。

posted:
last update: