トピックへのリンク:https://www.luogu.org/problem/CF1207D
質問の意味:任意の次元で1-nから非減少満たすためならば、あなたに二次元の2次元のシーケンスを、与えるために、悪いシーケンスであり、それ以外の場合は良い順序で、どのように多くの良い順序でソートを問い合わせます
分析:モノトーンは、第1および第2の次元の最初の行はそれぞれ、C1は、C2、次いで同時に、最初の行を満たし、第2の次元は非減少の総数を得ることができ、C3と呼ばれます
したがって、答えは:n個(合計) - (C1 + C2-C3)(悪いシーケンス番号)!
さらに剰余乗算の後に減少また、この設計は、直接処理することができます
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 const int型 MAXN = 3E5 + 7 。 const int型 INF = 0x3f3f3f3f 。 const int型 N = 1E7; constの LL MOD = 998244353 ; #define meminf(A)のmemset(0x3fを、はsizeof(A)) の#define MEM0(A)のmemset(0、はsizeof(A)) 構造体ノード{ int型X、Y。 } [MAXN]。 ブール CMP1(ノードA、ノード&B){ 戻り AX < BX。 } ブール CMP2(CONSTノードと、CONSTノード&B){ 戻り AY < によって、 } ブール CMP3(CONSTノードと、CONSTノード&B){ 戻り AX == BX AY <によって:AX < BX。 } int型のmain(){ int型のn; scanf関数(" %のD "、&N) 用(int型 i = 1 ; iが<= N; iが++)のscanf(" %D%dの"、および[I] .X、&[I] .Y)。 ソート(A + 1、A + 1 + 、N-、CMP1); LLのFX = 1 、K; // 非減少第一次元のFXレコード番号 のために(INT I = 1 ; I <= N; I ++は){ IF([I]。 ==のX [I- 1 ] .X)K ++ 、 他の K = 1。; FX =(K * FX)%MOD; } ソート(A + 1、A + 1 + 、N-、CMP2); LL FY = 1 ; のため(INT I = 1 ; I <= N; I ++ ){ もし([I] .Y == A [I- 1 ]・Y)は、k ++ ; 他のk = 1 ; FY =(FY * K)%のMOD。 } ソート(A + 1、+ 1 + N、CMP3)。 LL F = 1 。 以下のために(int型 i = 1 ; iは= N <; iは++ ){ 場合([i]が.Y <[I- 1 ]・Y){ F = 0 。 破ります; } } もし、(F){ ため(INTi = 1 ; iは= <N; iは++ ){ 場合([i]が.Y == A [I- 1 ] .Y && [I] .X == A [I- 1 ] .X)K ++ 。 他のk = 1 ; F =(F *のkの)%MOD。 } } のLLのRES =(FX + FY-F + MOD)%MOD。 LL RES2 = 1 。 以下のために(int型 i = 1 ; iが<= N; iは++)RES2 =(RES2 * I)%MOD。 printf(" %LLDする\ n "、(RES2-RES + MOD)%のMOD)。 リターン 0 ; }