あなたのウィンドウのスター

あなたのウィンドウのスター

問題の意味:面Nに最大輝度値を求めて星、輝度値の各スター、星一周するW * Hの長方形、(エッジではないが)が得られます。

アイデア:長い時間のようなだけで、他の人の報告書の解決を見て理解していませんでした。
限り元のクロックとして、スターセグメント間隔影響を及ぼす可能性が各範囲の最大値を見つけることができるように変換し、[(x、y)を、( X + W-1、Y + H-1)] と重みを有します彼らは偶然かもしれない、この長方形は限り重複矩形がライン上に最大重量を得られるような、つまり、一緒に述べています。

xの昇順で、離散のyの値は、各スターの縦座標、Y、Y + H-1、各スターは矩形に影響を与えることができるということであり、y軸上に投影次いでX、X + W-図1は、イベントと一つうち、互いに対向によって運ば値にイベントである。再び横断全ての矩形がその最大値をとるANSである場合、ノード[1]が現在の最大値を保存.SUM

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
typedefの長い長いLL。
const int型MAXN = 100010; 
構造体ノード{ 
    LLのX、Y1、Y2、ヴァル。
    ブール演算子<(constのノード&B)は、CONST { 
        (X = BX!)X <BX返す場合、それ以外の値> b.valを返します。
    } 
} [MAXN * 2]。
ベクトル<整数> V。

構造体ノード1 { 
    LLのL、R、和、のLaz。
}ツリー[MAXN << 2]。

ボイドビルド(RT -1,11,11-のL、LLのR){ 
    ツリー[RT] .L = L。
    ツリー[RT] .R = R。
    ツリー[RT] .SUM =ツリー[RT] .laz = 0。
    (L == R)戻った場合。
    LL半ば=(L + R)>> 1。
    (RT << 1、L、ミッド)を構築します。
    (RT << 1 | 1、ミッド+ 1、r)を構築します。
}

    ツリー[RT << 1] .SUM + =ツリー[RT] .laz。
    ツリー[RT << 1 | 1] .SUM + =ツリー[RT] .laz。
    ツリー[RT << 1] .laz + =ツリー[RT] .laz。
    ツリー[RT << 1 | 1] .laz + =ツリー[RT] .laz。
    ツリー[RT] .laz = 0。
} 
ボイド更新(RT -1,11,11- L、R -1,11,11-のK){ 
    IF(L ==ツリー[RT] .L &&ツリー[RT] .R == R){ 
        ツリー[RT] .laz + = K。
        [RT] .SUM + = K木。
        返します。
    } 
    IF(ツリー[RT] .L ==ツリー[RT] .R)リターン。
    IF(ツリー[RT] .laz)プッシュ(RT)。
    LL半ば=(ツリー[RT] .L +ツリー[RT] .R)>> 1。
    IF(R <= MID)更新(RT << 1、L、R、K)。
    それ以外の場合(L>中旬)更新(RT << 1 | 1、L、R、K);
        アップデート(RT << 1 | 1、中間+ 1、R、K)。
    } 
    ツリー[RT] .SUM = MAX(ツリー[RT << 1] .SUM、ツリー[RT << 1 | 1] .SUM)。
} 
{メインINT()
    LL N、H、wは。
    一方、(〜のscanf( "%LLD%LLD%LLD"、&N、&W&H)){ 
        v.clear()。
        (I 0 = int型、iがN <; Iは++){ため
            のscanf( "%LLD%LLD%LLD"、および[I] .X、&[I] .y1、&[I] .val)。
            v.push_back([I] .y1)。
            v.push_back([I] .y1 + H-1)。
            [I] .y2 = A [i]が.y1 + H - 1。
            A [iがN +] = [I]。
            .X = A [i]が.X + W [iがnを+] - 1。
            [iがnを+] .val = -a [I] .val。
        } 
        ソート(v.begin()、v.end())。
        LLのCNT =一意(v.begin()、v.end()) - v.begin()。
        v.erase(ユニーク(v.begin()、v.end())、v.end())。
        (1、1、CNT)を構築。
        LL ANS = 0。
        以下のために(; iがn * 2 <; I = 0 int型私は++){ 
            int型Lを= LOWER_BOUND(v.begin()、v.end()、[I] .y1)-v.begin()+ 1。
            INT R = LOWER_BOUND(v.begin()、v.end()、[I] .y2)-v.begin()+ 1。
            アップデート(1、L、R、[I] .val)。
            ANS = MAX(ANS、木[1] .SUM)を、
        } 
        のprintf( "%LLDする\ n"、ANS)。
    } 
}

  

おすすめ

転載: www.cnblogs.com/Accpted/p/11421877.html