リンク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 ; }