結論:配列があれば、良好な配列であり、その長さは3中に存在する配列を低下させない場合にのみ
証明:3滴の配列の長さを示唆して考えてみては必然的に、3回交換しました
これら三つの利点実際には2、したがって、違法
また、取得することができる:i番目、または最大プレフィックスを、いずれかのMEX前
(つまり、彼よりどちらか彼の前にいない大きな、または後、彼よりも、彼は劣らせません)
Fと[i] [j]は、残りの番号i、(辞書式順序とは見なされない)NJ充填の現在の実施形態の最大値を表します
再帰式を得た結論によれば、F [0] [0] = 1 [I] [J] = \ sum_ {k = 0} ^ {J} F [I-1] [k]は$、F $
すなわち、$のF [i] [j]はFを= [I-1]〜[J] + F [I] [J-1] $、$ Fについて解く[i] [j]は、Cを=(iは、JがJ + 1) -c $(iはJ、J-2 +)(メソッドを構築:任意の数cを見つけることを(私は満たされているJ + K 1、J + K2を)+、それは一定であることができます)
位置よりも良い2.Iシーケンス番号P、Pの1.I前と同じ第1及びプレ階乗逆、その後Fを迅速に計算することができ、そして列挙した後、I、及び計算
私の最大値は、Xの前に[P [i]は<Y \ルX] + F MEX Y、分けて考える新しい最大充填の貢献とkが持っている$ ANS + = CDOT \ [NI] [NX] fは、提供されています合計$、 - [N-I + 1] [1 N- \ MAX(X、P [I])]
コードの表示
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#define MOD 998244353 4 の#define N 1200005 5 int型、T、N、K、X、Y、ANS、VIS [N]、FAC [N]、INV [N]。 6 INT C(整数 nは、INTのM){ 7 であれば(M < 0)戻り 0 ; 8 リターン 1LLの* FAC [N] * INV [M]%MOD * INV [nm]の%MOD。 9 } 10 int型 F(int型のn、int型M){ 11 リターン(C(N + M、M)-C(N + M、M- 1)+ MOD)%MOD。 12 } 13 INT メイン(){ 14 FAC [ 0 ] = INVを[ 0 ] = INVを[ 1 ] = 1 。 15 のためには、(int型 = Iを1 ; iはN- < 4 ; I ++)FAC [i]は= 1LL * FACを[I- 1 ] * I%MOD。 16 のためには、(int型、I = 2 ; iはN- < 4 ; iは++)INVを[I] = 1LL *(MOD-MOD / I)* INV [MOD%I]%MOD。 17 のために(int型 = Iを2 ; iは<N- 4;私は、[1- [I] = 1LLの*のINV)INV ++を1 [I]%INV *] MOD。 18 のscanf(" %dの"、&T)。 19 一方(t-- ){ 20 のscanf(" %d個"、&N) 21 X = ANS = 0 。 22 、Y = 1 。 23 のためには、(int型 i = 1 ; iが<= N + 1、iは++)VIS [I] = 0 ; 24 のために(int型 i = 1 ; iが<= N iが++ ){ 25 scanf関数(" %のD "、&K)。 26 であれば((K <Y)&&(Y <= X))ANS =(ANS + F(NI、NX))%MOD。 27 X = MAX(X、K)。 28 であれば(X <N)= ANS(ANS + F(N-I + 1、NX- 1))%MOD。 29 であれば((K = X)&&(K =!Y)){ 30 のための(iは++ iが++; iが<= N)のscanf(" %※D " )。 31 ブレーク; 32 } 33 VIS [K] = 1に。 34 一方(VIS [Y])Y ++ 。 35 } 36 のprintf(" %Dを\ n " 、ANS)。 37 } 38 }