セグメントツリーの最適化は、I(良いタイトル)以上の牛最初の学校をオフdp--

 そして、二日は2つの最適化されたデータ構造DPタイトルを行う、またはする同じルーチンについて

問題のリンクを解決!https://www.cnblogs.com/kls123/p/11221471.html 

いくつかのサプリメント

実際には、DP [i]は、この問題ではないすべての点と主張するが、Yの答えであるポリラインは、現在縦に滞在される離散Yの各々は、理解することができます

各点pのために、さらにトラバースポイントを進めるから、左から右に[i]は3例を考えてみます。

この時点後1ポリラインの場所、そしてこれは、pに等しい未満からポリラインでなければなりませんあなたが両極端の範囲を照会することができますので、[i]は、折り畳んだ.Y

2.折り線上この時点では、この点により破線が可能なこれらの値を更新します

前記折り線より下の点、および共感2

折り線を直接、Y = 0から折り畳むことができるので、それは間違ったことなく、転送すべき第一のタイプのY = 0点を大きくする必要があり、この場合は以下に等しいです!

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#defineっ長い長 
 の#define LSONのL、M、RT << 1つ
 の#define rsonのM + 1、R、RT << 1 | 1
 の#define中間LL M =(L + R)>> 1つのconst int型 M = 1E5 + 10 ; 
LLのMX [M << 2 ]、怠惰[M << 2 ]。
無効アップ(LL RT){ 
    MX [RT] = MAX(MX [RT << 1 ]、MX [RT << 1 | 1 ])。
} ボイドプッシュダウン(LLのRT){
     場合(怠惰[RT]){ 
        怠惰[RT << 1 ] + =

 

怠惰[RT]。
        怠惰な[RT << 1 | 1 ] + = 怠惰[RT]。
        MX [RT << 1 ] + = 怠惰[RT]。
        MX [RT << 1 | 1 ] + = 怠惰[RT]。
        怠惰[RT] = 0 ; 
    } 
} 

ボイドビルド(LLのL、LL R、LLのRT){ 
    怠惰[RT] = 0 ; MX [RT] = 0 ;
    もし(L == R){
         リターン
    } 
    半ば; 
    (LSON)を構築します。(rson)を構築します。
} 

のボイド更新(LL pを、LLのC、LLのL、R -1,11,11-のRT){
     場合(L == R){ 
        MX [RT] = MAX(MX [RT]、C)。
        返します
    } 
    プッシュダウン(RT)。
    ミッド; 
    もし(p <= m)の更新(P、C、LSON)。
    他の更新(P、C、rson)。
    (RT)まで。
} 

ボイドアップデート1(LLのL、R -1,11,11-のC、LLのL、R -1,11,11- RT){
     場合(L> R)のリターン ;  // 会出现L> R的情况、需要判下
    であれば(L <= 1 && R> = R){ 
        MX [RT] + = C。
        怠惰[RT] + = C。
        リターン; 
    } 
    プッシュダウン(RT)。
    ミッド; 
    もし(L <= M)アップデート1(L、R、C、LSON)。
    もし(R> M)アップデート1(L、R、C、rson)。
    (RT)まで。
} 

LLクエリ(LLのL、R -1,11,11- L、LL R、LL RT){ 
    場合(L> R)戻り 0 ;
    場合(L <= 1 && R> = r)は{
         返すMX [RT]。
    } 
    プッシュダウン(RT)。
    ミッド; 
    LL RET = 0 もし(L <= M)RET = MAX(RET、クエリ(L、R、LSON))。
    もし(R> M)RET = MAX(RET、クエリ(L、R、rson))。
    リターンRET; 
} 

構造体ノード{ 
    LLのX、Y、B。
} V [M]。
BOOL CMP(ノードAA、ノードBB){
     場合(aa.x == bb.x)戻り aa.y> bb.y。
    返す aa.x < bb.x。
} 
LL T [M]。
INT )(主
{ 
    LL N。
    一方、(scanf関数(" %のLLD "!、&N)= EOF){ 
        LLのCNT = 0 (LL i = 1 ; iが<= N; iが++ ){ 
            scanf関数(" %LLD%LLD%LLD%LLD "、&​​V [i]は.X、&V [i]は.Y、&V [i]は.A、&V [i]は.B)。
            T [ ++ CNT] = V [i]の.Yと、
        } 
        ソート(T + 1、T + 1本の + CNT)。
        ソート(V + 1、V + 1 + N、CMP)。
        LLのM =一意(T + 1、T + 1本の + CNT)-T- 1 (LL i = 1 ; iが<= N iが++ 
            V [i]は.Y = LOWER_BOUND(T + 1、T + 1 + M、V [i]は.Y)-t + 1// 离散化时点都向后移一位
        M ++;  // 点后移了一位、长度要+1; 
        ビルド(1、M、1 )。
        (LL i = 1 ; iが<= N; iが++ ){ 
            LL ANS =クエリ(1、V [i]が.Y、1、M、1 )。
            アップデート1(V [I]・Y + 1、Mは、V [i]は.B、1、M、1 )。
            アップデート1(1、V [i]を.y- 1、V [i]は.A、1、M、1 )。
            アップデート(V [i]が.Y、ANS + V [i]は.B、1、M、1 )。
        } 
        のprintf(" %LLDする\ n "、MX [ 1 ])。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/zsben991126/p/11285257.html