雪に覆われたスマイルHDU 6638セグメントツリー

 

質問の意味:各点についていくつかのポイントは、この内部重みの値と2次元平面で最大のように、選択された矩形の値は長方形の所有権を取る方法を求める権利があります

 

ゲームは同情を考えた場合には  

私は列挙列挙上限と下限上限と下限を考えてきたが、確かに十分ではありませんが、ログn2の残りの部分を費やしてきました

 

あなただけの国境を列挙して、動的に下限を列挙することができます  

 

更新は[J] .X!= A [J-1] .Xまで待たなければならない場合があります

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
// BXDによる入力
の#define担当者(iは、b)のための(; iは=(b)の<I ++はiは(A)= INT)
 の#defineためreppを(I、B)(I =(A int型); I> =(B); - I)
 の#defineが長い長いちゃう
 の#define(X)(CERR <<(#xを)参照<< '=' <<(X)<< ENDL)
 の#define PB一back
 #define INF 0x3f3f3f3f
 の#define CLR(A、V)のmemset(A、V、Aはsizeof)
のtypedef対 < INTINT > PII。
///////////////////////////////// / 
CONSTの INT N = 2E6 + 10 

#defineLSONのL、M、POS << 1つ
 の#define rsonのM + 1、R、POS << 1 | 1つ

のLL LMAX [N << 2 ]、RMAX [Nは、<< 2 ]、T [N << 2 ]、maxans [N << 2 ]。

無効アップ(int型のPOS)
{ 
    T [POS] = tの[POS << 1 ] + T [POS << 1 | 1 ]。
    maxans [POS] = MAX(MAX(maxans [POS << 1 ]、maxans [POS << 1 | 1 ])、RMAX [POS << 1 ] + LMAX [POS << 1 | 1 ])。
    LMAX [POS] = MAX(LMAX [POS << 1 ]、] + LMAX [POS << 1 | 1 ])。
    RMAX [POS] = MAX(RMAX [POS << 1 | 1 ]、T [POS << 1 | 1 ] + RMAX [POS << 1 ])。
} 
ボイドビルド(int型 L、int型の R、int型のPOS)
{ 
    場合(L == R){LMAX [POS]がRMAX [POS]を= = tの[POS] = maxans [POS] = 0 ; 返します}
     INT M =(L + R)>> 1 
    (rson)の構築;(LSON)をビルドアップ(POS)を、
} 
ボイドアップノード(INT X、LLのV、INTを L、INT R、INT POS)
{ 
    場合(L == R){T [POS] + = V。LMAX [POS]はRMAX [POS] = maxans [POS] = maxに(1LL * = 0、T [POS])。リターン;}
     int型、M =(L + R)>> 1 もし(x <= M)アップノード(X、V、LSON)。
    他のアップノード(X、V、rson)。
    (POS)アップ。
} 
int型NN、K、B [N]、N。

構造体ノード
{ 
    int型のX、Y、W。
} [N]。
INT のmain()
{ 
    int型CAS。
    cinを >> CAS;
    しばらく(cas--  
    {
        のscanf("%のD "、&N)
        担当者(I、1 、N)
        { 
            scanf関数(" %D%D%D "、および[I] .X、&[I] .Y、および[I] .W)。
            B [ ++ NN] = [I] .Yと、
        } 
        ソート(B + 1、B + 1 + NN)。
        NN =一意(B + 1、B + 1 + NN)-B- 1 
        担当者(I、1 、N)
        [I] .Y = LOWER_BOUND(B + 1、B + 1 + nnは、[I] .Y) - B。
        ソート( +  1、A + 1 + nは、[](ノードA、ノードB){ 戻り AX <BX || AX == BX && a.y < によって;}); 
        LL ANS = 0 
        担当者(I、1 、N)
        { 
            場合(I =!1 && [I] .X == A [I- 1 ] .X)続けます
            (ビルド1、nnは、1 ); 
            担当者(J、I、N)
            { 
                場合(J =私は[J] .X = [J = &&!1 ] .X)
                    ANS = MAX(ANS、maxans [ 1 ])。
                アップノード([J] .Y、1LL* [J] .W、1、NN、1 ); 
            }  = MAX(年maxans [ 1 ])。
        } 
        Coutの <<年齢<< てendl; 
    } 
    戻り 0 
}
コードの表示

 

おすすめ

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