C.順列パーティション

リンクhttp://codeforces.com/contest/1326/problem/C

効果の対象に

あなたの配列を与え、その後、あなたがブロックに彼を聞かせするために、コンクリートはk個のブロックに分割し、各ピースの最大数と最大を聞かせています。

練習

その後、直接配列をソートするには、ブロックの最初のk個の要素を取り、最大であり、問​​題はどのようにパーティション化されたプログラム番号です。

元の列のここではいくつかが並んで。そして、保守点検。前にそれぞれの出会いは++上の要素の合計を計算するために時間を割いていません。そして、かつて最大の要素に乗るのブロックに遭遇したが、回答内側に彼を連れて行きました。すなわち、この範囲内でグループ化することができます。範囲内で可能であることすべてをやってそうで。詳細については、まだしてくださいコメント、インサイダーがわからない場合、コードを参照してください。

コード

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
長い 長い [ 200005 ]。
長い 長い B [ 200005 ]。
int型の融点[ 200005 ]。
長い 長い MOD = 998244353 ; 
 
int型のmain(){
     int型のn、kは、
    CIN >> N >> K。
    以下のためにINT iが= 1 ; I <= N; I ++ ){ 
        CIN >> [I]。
        B [I] = [I]。
    } 
        長い 長い ANS =0 ; 
    ソート( + 1、+ N + 1、より大きな< 長い  > ());
    以下のためにINT iが= 1 ; I <= K; I ++ ){ 
            ANS + = A [i]は、
        MP [I] = - 1 
    } 
 
    長い 長いチェック= 1 長い 長い FA = 1 
    coutの << ANS << "  " ;
    INTフラグ= 0 以下のためのint型 I =1 ; I <= N; I ++ ){
         場合(MP [B [I]] == - 1)フラグ= 1 もし(フラグ){
         場合(!MP [B [I] = - 1)チェック++ 他の{ 
            FA * =チェック%のMOD。
            FA = FA%MOD。
            チェック = 1 ; 
        } 
        } 
    } 
    COUT << FA%MOD << ENDL。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/LH2000/p/12528898.html