Official

C - Circular Addition Editorial by maroonrk_admin


\(1\) 回の操作につき,全体の \(x\) の要素の最大値は高々 \(1\) 増えます. また,\(x\) の隣接項の差分の絶対値の和 (\(=\sum_{1 \leq i \leq N-1} |x_i-x_{i+1}|+|x_N-x_1|\)) は,高々 \(2\) 増えます.

よって,\(M=\max{A_i}\)\(D=(\sum_{1 \leq i \leq N-1} |A_i-A_{i+1}|+|A_N-A_1|)/2\) とおくと,操作回数の下界は \(\max(M,D)\) になります.

実はこの下界が達成可能です. 以下それを示します.

操作を逆順に見て,\(A\) に対し \(1\) 回操作を行い,\(\max(M,D)\) の値を \(1\) 減らせることを示します.

まず,\(M>D\) のケースを考えます.この時,\(A_i=0\) となるような \(i\) は存在しないことが確認できます(\(0,\cdots,M,\cdots,0\) と一周することを考えると,\(M \leq D\) となるため矛盾します).よって,\(A\) 全体を \(-1\) するような操作を行えばよいです.

次に,\(M<D\) のケースでは,\(A\) の中で \(M\) が連続する極大な区間を一つ取り,ここを \(-1\) するような操作を考えればよいです.

最後に,\(M=D\) のケースです. \(M < D\) のケースと同様,\(A\) の中で \(M\) が連続する極大な区間を考えます. もしこのような区間が一意ならば,そこを \(-1\) するような操作を行えば,\(M,D\) どちらも値が \(1\) 減ります. そのような区間が複数ある場合を考えます. この時,\(A_i=0\) となるような \(i\) は存在しないことが確認できます(\(0,\cdots,M,\cdots,M\) 未満 \(,\cdots,M,\cdots,0\) と一周することを考えると,\(M<D\) がわかります). よって,\(M\) をすべて含むような極小な区間,を選んで操作することを考えると,\(M,D\) がどちらも \(1\) 減ることがわかります.

よって示されました. 実装は自明で,計算量は \(O(N)\) です.

解答例(c++)

posted:
last update: