P3928 SAC E#1 - 簡単な質問配列2ツリーラインの最適化DP

 

 

 

 

(または選択されていない)は、各列の番号を選択する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)>> 1int型 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(11、[I] [ 1 ]1、NN、1 ))。
        DP [I] [ 1 ] = MAX(DP [I] [ 1 ]、qmaxx(21、[I] [ 1 ]、1、NN、1 ))。
        DP [I] [ 1 ] = MAX(DP [I] [ 1 ]、qmaxx(31、[I] [ 1 ]、1、NN、1 ))。
        DP [I] [ 1 ] = MAX(DP [I] [ 1 ]、qmaxx(41、[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(11、[I] [ 3 ]、1、NN、1 ))。
        DP [I] [ 3 ] = MAX(DP [I] [ 3 ]、qmaxx(21、[I] [ 3 ]、1、NN、1 ))。
        DP [I] [ 3 ] = MAX(DP [I] [ 3 ]、qmaxx(31、[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、14  = MAX(年DP [I] [J])。
    coutの << 年。

    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/bxd123/p/11412367.html