CF1326C順列パーティション题解、

オリジナルタイトルリンク

質問の意味簡単に言えば:

所与\(1 \) \(\ N-)置換されている、アレイはに分割されている\(K \)の間隔、その結果、各間隔と最大の最大値。この値は、プログラム・パーティションの数を検索します。

キーがある\(1 \) \(\ N-)に交換。

もちろん、あなただけ置く- (K + 1 \ nは\ ) にする(N \)\この段落、各サブセクション(ランダムポイントの残りの部分)。

明らかに最初の答えは、描画することができます。

\ [(N-K + 1)+(N-K + 1)+ \ cdots +(N-1)+ N \]

(もちろん、あなたが等差数列の和を使用することができますが、必要ではないであろう、第二は、答えを求めながら、とき、あなたはああ方法を見つけることができます

例えば:(第三のサンプルに、例えば)

7 3
2 7 3 1 5 4 6

そして、あなたが入れた\(5 \)、\ (6 \)、\ (7 \)各区間の最大値として。

この時点で、あなたは、たとえば、わかります\(3 \空間1 \)この段落。

これは、どちらかのすべてに行くだ(7 \)\すべての下で、(5 \)\、または2つのセクションに分かれ、左リターン(\ 7 \) リターンの右\(5 \)

だから、あなたが思う、これはあなたがセグメントでそれを置くことができ、任意の位置に相当します。(左端と右端、この期間に属してやる含みます)

その後、プログラムの数がある(3 \)\

されている\(5 \)位置が減算される(\ 7 \)位置、すなわち\( - 2 = 3 \ 5)

そして、三つの部分の合計は、算出しました。よると、乗算原則ご利用いただけます:

\ [1 \回3 \回2 = 6 \]

従って、第2の答えは次のとおりです。

\(\ GEQ N - K + 1 \) 前の数の\(\ GEQ N - K + 1 \) の位置の数の差との積。

最初のゼロ(\ GEQ N - K + 1 \)\ 数字の位置が、我々は信じている\(0 \)

開くことを忘れないでください\(\ textttロングロング} {\)

OI無益十年は、父親を見て、長い長い開けません

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll MOD=998244353;

inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
    int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}

int n,k,last;
ll s=0,cnt=1;

int main(){
    n=read(),k=read();
    for(int i=1,t;i<=n;i++) {
        t=read(); if(t>n-k) {
            s+=t; if(!last) last=i; //维护上一个 >= n - k + 1 的数的位置
            else cnt=cnt*(i-last)%MOD,last=i; //计数
        } 
    } printf("%lld %lld\n",s,cnt); 
    return 0;
}

おすすめ

転載: www.cnblogs.com/bifanwen/p/12545373.html