https://atcoder.jp/contests/apc001/tasks/apc001_b

ci=aibic_i = a_i - b_i とする。

3
1 2 3
5 2 2

であれば c=[4,0,1]c = [-4,0,1] となる。 目的は、全ての ii に対して ci=0c_i = 0 とすること。

aia_i22 を足し、bib_i11 を足す操作は、i=ji=j であれば cic_i11 を足し(操作1とする)、 iji \neq j ならば cic_i22 を足し、cjc_j から 11 を引く操作(操作2とする)に対応する。 数字を減らすのは操作2でしか行えないことに注意。

cic_i を非負の部分と負の部分に分け、 I+={ici0},I={ici<0}I_+ = \{ i \mid c_i ≥ 0\}, I_- = \{ i \mid c_i < 0 \}, S=iI+ci,V=iIci/2S = \sum_{i \in I+} c_i, V = \sum_{i \in I-}\lfloor |c_i|/2 \rfloor とおく。

SS は、操作2を行わなくてはいけない最低回数、VV00 を超えないようにマイナスになっている cic_i22 を足すことのできる最大回数とも考えられる。

操作1で任意の場所の数字を任意の数だけ増やせるので、I+=I_+ = \empty つまり S=0S=0 の状態にできれば良い。

操作1 または 操作2 で SS を減らすことを考える。

操作2で、ci2,cj>0c_i \le -2, c_j > 0 となっている i,ji,j を選んで cic_i+2+2, cjc_j1-1 すること(操作☆と呼ぶ)でしか SS は減らせないことがわかる。 この時、S,VS, V がともに1減少する。

それ以外のパターンを考えると、

  • 操作1 -> ci0c_i \ge 0 なら SS が1増加、それ以外なら VV が0または1減少
  • 操作2 -> +2+2 する操作により、 SS が 1以上増加するか VV が1減少する。cj0c_j \le 0 の時、1-1 する操作では VV を高々1しか増やせない。

上により、どう頑張っても VV を増やすことはできないことがわかる。

SVS ≤ V ならば、ci2,cj>0c_i \le -2, c_j > 0 となっている i,ji,j を選んで操作☆を続けることで S=0S=0 とできる。 それ以外ならどう頑張っても SS 回上のような操作ができないので、目的が達成できない。

https://atcoder.jp/contests/apc001/submissions/32369370