https://atcoder.jp/contests/apc001/tasks/apc001_b
ci=ai−bi とする。
3
1 2 3
5 2 2
であれば c=[−4,0,1] となる。 目的は、全ての i に対して ci=0 とすること。
ai に 2 を足し、bi に 1 を足す操作は、i=j であれば ci に 1 を足し(操作1とする)、
i=j ならば ci に 2 を足し、cj から 1 を引く操作(操作2とする)に対応する。
数字を減らすのは操作2でしか行えないことに注意。
ci を非負の部分と負の部分に分け、
I+={i∣ci≥0},I−={i∣ci<0},
S=∑i∈I+ci,V=∑i∈I−⌊∣ci∣/2⌋ とおく。
S は、操作2を行わなくてはいけない最低回数、V は 0 を超えないようにマイナスになっている ci に 2 を足すことのできる最大回数とも考えられる。
操作1で任意の場所の数字を任意の数だけ増やせるので、I+=∅ つまり S=0 の状態にできれば良い。
操作1 または 操作2 で S を減らすことを考える。
操作2で、ci≤−2,cj>0 となっている i,j を選んで ci に +2, cj に −1 すること(操作☆と呼ぶ)でしか S は減らせないことがわかる。
この時、S,V がともに1減少する。
それ以外のパターンを考えると、
- 操作1 -> ci≥0 なら S が1増加、それ以外なら V が0または1減少
- 操作2 -> +2 する操作により、 S が 1以上増加するか V が1減少する。cj≤0 の時、−1 する操作では V を高々1しか増やせない。
上により、どう頑張っても V を増やすことはできないことがわかる。
S≤V ならば、ci≤−2,cj>0 となっている i,j を選んで操作☆を続けることで S=0 とできる。
それ以外ならどう頑張っても S 回上のような操作ができないので、目的が達成できない。
https://atcoder.jp/contests/apc001/submissions/32369370