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)\) です.
posted:
last update: