P4343 [SHOI2015]自動機ブラシタイトル
答えは明白な二分法
その後中旬のために合わせて直接何質問をシミュレートすることを目的と
cntが== k個のANS = xであれば、唯一の答えを記録に等しく、
最後に、覚えている:-1出力のみ!
コード:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 N = 100005 ; typedefの長い 長いLL。 int型N、K。 LL [N]。 LLのL、R、ANS。 インラインブールCHECK1(LLのX){ int型の CNT = 0 。 LL合計 = 0 ; 以下のために(int型 i = 1 ; iが<= N; iは++ ){ 合計 + = [I]。 もし(和> = X){ 和 = 0 。 CNT++ ; } もし(合計< 0)合計= 0 ; } // gcout << X << "LL" << CNT << ENDL。 // coutの<< CNT <<」「<< X <<てendl; もし(CNT == K)のANS =のX。 返す CNT> = kは?1:0 。 } インラインブールCHECK2(LLのX){ int型の CNT = 0 。 LL合計 = 0 ; 以下のために(int型 i = 1 ; iが<= N; iは++ ){ 合計 + = [I]。 (和> = X){ 和 = 0 。 CNT ++ ; } もし(合計< 0)合計= 0 ; } であれば(CNT == k)はANS =のX。 // coutの<< CNT <<てendl; 戻り CNT <= kは、 } int型のmain(){ scanf関数(" %D%dの"、&N&K)。 以下のために(int型 i = 1 ; iが<= N; iが++ ){ scanf関数(" %のLLD "、&[I])。 } L = 1LL、R = 2388780192198ll、ANS = - 1LL。 一方、(L <= R){ // COUT << L <<」「<< R << ENDL。 半ば=(L + R)/ LL 2LL。 もし(CHECK2(MID))、R =ミッド1LL。 他リットル=ミッド+ 1LL。 } のprintf(" %のLLD " 、ANS)。 もし(ANS == - 1)戻り 0 ; L = 1LL、R = 2388780192198ll、ANS = - 1LL。 一方、(L <= R){ // COUT << L <<」「<< R << ENDL。あれば(CHECK1(MID))L =ミッド+ 1LL。 他の R =半ば1LL。 } のprintf(" %LLDする\ n " 、ANS)。 リターン 0 ; }