P4343 [SHOI2015]自動機ブラシタイトル

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は?10 
} 
インラインブール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 ; 
}

 

おすすめ

転載: www.cnblogs.com/QYJ060604/p/11568181.html