Official
B - +1 and -1 Editorial
by
B - +1 and -1 Editorial
by
Nyaan
\(A\) を広義単調増加な数列にすることが可能であることは、実は次の条件と同値です。
- 最大値と最小値の差が \(1\) である広義単調増加な数列を良い数列と呼ぶ。操作によって \(A\) を良い数列にすることが可能である。
(証明) 良い数列は広義単調増加なので、\(A\) を良い数列にすることが可能ならば \(A\) を広義単調増加にすることは可能である。
逆に \(A\) を広義単調増加な数列に変換することが可能であるとする。この時、はじめに操作によって \(A\) を広義単調増加な数列にした後、次の操作を行うことで \(A\) を良い数列に変換することが可能である。
- 不変条件 : はじめ列 \((A_1)\) は良い数列であり、\(A\) は広義単調増加である。
- \(i = 2, 3, \dots, N\) の順に次の操作を行う。
- 不変条件:\((A_1, A_2, \dots, A_{i-1})\) は良い数列であり、\(A\) は広義単調増加である。
- \((A_1, A_2, \dots, A_i)\) が良い数列でない間、次の操作を行う。
- 地点 \(j\) \((1 \leq j \leq i-1)\) であって「\(A_j\) に \(1\) を加算しても \((A_1, A_2, \dots, A_{i-1})\) は良い数列のままである」という箇所が丁度 1 ヵ所存在する。そして、\((j, i)\) に対して操作を行う。
- 操作を繰り返すと必ずどこかで \((A_1, A_2, \dots, A_i)\) が良い数列になる。\(A_{i-1}\) と \(A_i\) の値が一致すれば \((A_1, A_2, \dots, A_i)\) は良い数列になり、操作によって \(A_{i-1}\) と \(A_i\) の差は \(1\) または \(2\) 縮まるため、もし達成しないとすれば「\(A_{i-1}\) と \(A_i\) の差が \(1\) の時に \(j=i-1\) を選んで操作した時」だが、この場合 \((A_1, A_2, \dots, A_{i-1}, A_i) = (x, x, \dots x, x+1)\) という値になっていて既に \((A_1, A_2, \dots, A_i)\) が良い数列になっているため操作が行われることは無い。
- 地点 \(j\) \((1 \leq j \leq i-1)\) であって「\(A_j\) に \(1\) を加算しても \((A_1, A_2, \dots, A_{i-1})\) は良い数列のままである」という箇所が丁度 1 ヵ所存在する。そして、\((j, i)\) に対して操作を行う。
- 操作後は \((A_1, A_2, \dots, A_i)\) は良い数列であり、かつ \(A_i \leq A_{i+1}\) も満たしているため \(A\) は広義単調増加を保っている。
よって 2 つの命題は同値であることが証明できた。(証明終わり)
\(A\) を良い数列にすることが可能かどうかは累積和を用いれば \(\mathrm{O}(N)\) で判定できます。よってこの問題をテストケースあたり \(\mathrm{O}(N)\) で解くことが出来て、十分高速です。
posted:
last update:
