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

ci=ai−bic_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_i に 22 を足し、bib_i に 11 を足す操作は、i=ji=j であれば cic_i に 11 を足し(操作1とする)、 i≠ji \neq j ならば cic_i に 22 を足し、cjc_j から 11 を引く操作(操作2とする)に対応する。 数字を減らすのは操作2でしか行えないことに注意。

cic_i を非負の部分と負の部分に分け、 I+={i∣ci≥0},I−={i∣ci<0}I_+ = \{ i \mid c_i ≥ 0\}, I_- = \{ i \mid c_i < 0 \}, S=∑i∈I+ci,V=∑i∈I−⌊∣ci∣/2⌋S = \sum_{i \in I+} c_i, V = \sum_{i \in I-}\lfloor |c_i|/2 \rfloor とおく。

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

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

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

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

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

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

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

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

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