http://codeforces.com/contest/1169/problem/C
明らかになった問題に誰か他の人のソリューションを見て、その後、質問の意味を理解していなかった長い時間を見て、あまりにも料理だった.......
数n、各動作可能([I] +1)%mを、数Nをデクリメントしないように、シーク操作の最小数。
Mは、同じ操作で回作動していない、上限をm、下限は0、二点である....
書式#include <iostreamの> 使用して 名前空間はstdを、 const int型 MAXN = 300000 + 10 。 INTのN、M。 INT [MAXN]。 INT [MAXN] B。 ブールチェック(INT X) { ため(int型 i = 1 ; iが<= N; iが++ ) B [I] = [I]。 用(int型 iは= 1 ; iが<= N; iが++ ) { 場合(B [I]> = bの[I- 1 ]) { 場合(B [I] + XM> = bの[I- 1]) B [I] = bの[I- 1 ]。 } そう であれば(B [i]が+ X> = B [I- 1 ]) B [I] = bの[I- 1 ]。 もし(B [i]が<B [I- 1 ]) を返す 偽。 } / * (I = 1をint型、iが<= N; iが++)のため COUT << B [i]は<<」「。 coutの<<てendl; * / 戻る 真。 } int型のmain() { CIN >> N >> M。 用(int型 iは= 1 iが<= N; iが++) { CIN >> [i]は、 } INT =左0、右M、MID、ANS = = 0 。 しながら、(左<= 右) { 半ば =(左+右)/ 2 。 もし(チェック(MID)) { ANS = ミッド。 右半ば= 1 ; } 他 { 左 =ミッド+ 1 。 } } COUT << ANS << ENDL。 リターン 0 ; }