(または選択されていない)は、各列の番号を選択する3×Nの小さな強い配列を取得するために、以下の条件が満たされています。
最初の行が選択されている場合は1、それは数より大きいか等しくなければなりません
第二行目が選択された場合2.、それは数に等しい未満でなければなりません
第3の行が選択された場合、3行目に選択されたいくつかの連続した期間のために、同じ方向(未満またはより大きい数に等しい数に等しい)を満たす必要があります
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define担当者(I、B)(I =(A)がINT;方には<=(B); iが++) の#define repp(I、B)(I =(A)がINTのために、I> = (B); - I) の#defineは長い長いっ の#defineは(X)(CERR <<(#X)<< '=' <<(X)<< ENDL)を参照 の#define INF 0x3f3f3f3f の#define CLR( 、V)のmemset(A、V、はsizeof A) //////////////////////////////////// / CONST INT N = 3E5 + 100 。 INT MAXX [ 5 ] [N << 2 ]、NN、N、B [N << 2 ]、DP [N] [ 5 ]、ANS、[N] [ 4 ]。 空隙アップノード(int型 ID、int型のx、int型 V、INTを L、int型の R、int型のPOS) { 場合(L == R){MAXX [ID] [POS] = MAX(MAXX [ID] [POS]、V)。リターン;} int型、M =(L + R)>> 1 。 もし(x <= M)アップノード(ID、X、V、L、M、POS << 1 )。 他のアップノード(ID、X、V、M + 1、R、POS << 1 | 1 )。 MAXX [ID] [POS] = MAX(MAXX [ID] [POS << 1 ]、MAXX [ID] [POS << 1 | 1 ])。 } int型 qmaxx(int型の ID、int型の L、INT R、int型の L、int型の R、int型のPOS) { 場合(L <= 1 && R <= R)戻りMAXX [ID] [POS]。 INT、M =(L + R)>> 1。int型 ANS = 0 ; もし(L <= M)ANS = MAX(ANS、qmaxx(ID、L、R、L、M、POS << 1 ))。 もし(R> M)ANS = MAX(ANS、qmaxx(ID、L、R、M + 1、R、POS << 1 | 1 ))。 戻るANSを。 } int型のmain() { scanf関数(" %dの"& n)は、 担当者(I、1、N)のscanf(" %dの」、および[I] [ 1 ])、[++ NN] [I] [= B 1 ]; 担当者(I、1、N)のscanf(" %dの"、および[I] [ 2 ])、[++ NN] [I] [= B 2 ]; 担当者(I、1、N)のscanf(" %dの"、&Aを[I] [ 3 ])、[++ NN] [I] [= B 3 ]; ソート(B + 1、B + 1 + NN); NN =一意(B + 1、B + 1 + NN)-B-を1 ; 担当者(I、1、N)[I] [ 1 ] = LOWER_BOUND(B + 1、B + 1 + nnは、[I] [ 1 ]) - B、 [I] [ 2 ] = LOWER_BOUND(B + 1、 B + 1 + nnは、[I] [ 2 ]) - B、 [I] [ 3 ] = LOWER_BOUND(B + 1、B + 1 + nnは、[I] [ 3 ]) - B。 担当者(I、1 、N) { DP [I] [ 1 ] = MAX(DP [I] [ 1 ]、qmaxx(1、1、[I] [ 1 ]1、NN、1 ))。 DP [I] [ 1 ] = MAX(DP [I] [ 1 ]、qmaxx(2、1、[I] [ 1 ]、1、NN、1 ))。 DP [I] [ 1 ] = MAX(DP [I] [ 1 ]、qmaxx(3、1、[I] [ 1 ]、1、NN、1 ))。 DP [I] [ 1 ] = MAX(DP [I] [ 1 ]、qmaxx(4、1、[I] [ 1 ]、1、NN、1 ))。 DP [i]の[1 ] ++ ; DP [I] [ 2 ] = MAX(DP [I] [ 2 ]、qmaxx(1、[I] [ 2 ]、NN、1、NN、1 ))。 DP [I] [ 2 ] = MAX(DP [I] [ 2 ]、qmaxx(2、[I] [ 2 ]、NN、1、NN、1 ))。 DP [I] [ 2 ] = MAX(DP [I] [ 2 ]、qmaxx(3、[I] [ 2 ]、NN、1、NN、1 ))。 DP [I] [ 2 ] = MAX(DP [I] [ 2 ]、qmaxx(4、[I] [ 2 ]、NN、1、NN、1 ))。 DP [i]の[ 2 ] ++ ; DP [I] [ 3 ] = MAX(DP [I] [ 3 ]、qmaxx(1、1、[I] [ 3 ]、1、NN、1 ))。 DP [I] [ 3 ] = MAX(DP [I] [ 3 ]、qmaxx(2、1、[I] [ 3 ]、1、NN、1 ))。 DP [I] [ 3 ] = MAX(DP [I] [ 3 ]、qmaxx(3、1、[I] [3 ]、1、NN、1 ))。 DP [i]は[ 3 ] ++ ; DP [I] [ 4 ] = MAX(DP [I] [ 4 ]、qmaxx(1、[I] [ 3 ]、NN、1、NN、1 ))。 DP [I] [ 4 ] = MAX(DP [I] [ 4 ]、qmaxx(2、[I] [ 3 ]、NN、1、NN、1 ))。 DP [I] [ 4 ] = MAX(DP [I] [ 4 ]、qmaxx(4、[I] [ 3 ]、NN、1、NN、1 ))。 DP [I] [4 ] ++ ; アップノード(1、[I] [ 1 ]、DP [I] [ 1 ]、1、NN、1 )。 アップノード(2、[I] [ 2 ]、DP [I] [ 2 ]、1、NN、1 )。 アップノード(3、[I] [ 3 ]、DP [I] [ 3 ]、1、NN、1 )。 アップノード(4、[I] [ 3 ]、DP [I] [ 4 ]、1、NN、1 )。 } 担当者(I、1、n)の 担当者(J、1、4 ) 年 = MAX(年DP [I] [J])。 coutの << 年。 リターン 0 ; }