【SHOI2007]庭師トラブル(離散、フェンウィックツリー)

【SHOI2007]庭師トラブル(luogu)

解決

大規模な座標範囲を見つけ、離散を考えます

まだ離散2次元データ構造を使用することはできません。しかし、その後、配列のサイズが大きすぎます

見つかった変更なし、クエリのみ

x座標は徐々に増加することが考えられる場合には、Yのみが情報記録を座標

クエリは、次に、左下隅の問い合わせのために(0,0)に4分割し、その後順次要約を計算します

座標と、アレイ内の各インタロゲーションツリーの座標、yは離散座標

プレスは、x x座標に等しい、バック依頼の前に大きな木に小さな座標

それは、そのツリーを打ったときアレイを介して、アレイは、y座標プラス1

照会要求ツリーアレイは、より少ないヒットとにy座標場合

コード

 

書式#include <cstdioを> 
する#include <cstdlib> 
書式#include <アルゴリズム>
 使用して 名前空間をSTD。
CONST  INT N = 3E6 + 10 INTのTR [N]、N、M、CNT、A、B、C、D、ANS [N]、TOT。
構造体ノード
{ 
    int型のx、ID。
    ブール 演算子 <(constのノード&O)のconst 
    { 
        リターン X < OX。
    } 
} [N]。
構造体のモード
{ 
    int型のX、Y、ID、INV。
    ブール 演算子 <(CONSTモード&O)CONST
    { 
        戻り X == OX ID <o.id:x <?OX。
    } 
} D [N]。
INT lowbit(INT X)
{ 
    戻り X&( - X)。
} 
INT  GETint型X)
{ 
    int型 ANS = 0 (; X; X- = lowbit(X))ANS + = TR [X]。
    戻り値は、ANS; 
} 
ボイド追加(int型X)
{ 
    ため(; X <= CNT; X + = lowbit(X))TR [X] ++ ; 
} 
int型のmain()
{ 
    scanf関数(" %D%D "、&​​N、&M)。
    以下のためにINT iが= 1 ; <I = N; I ++ 
    { 
        TOT ++ 
        scanf関数(" %D%D "、&​​D [TOT] .X、&D [TOT] .Y)。
        D [TOT] .X ++、D [TOT] .Y ++ 
        D [TOT] .ID = 0 
    } 
    のためのINT iは= 1 ; I <= M I ++ 
    { 
        scanf関数(" %D%D%D%D "、&​​A、&B、&C&D)。++、B ++、C ++、D ++ 
        D [全て++] =(モード){A- 1、B- 1、及び1 }。
        D [ ++すべて] =(モード){C、D、および1 }。
        D [ ++すべて] =(モード){A- 1、D、および- 1 }。
        D [ ++すべて] =(モード){C、B- 1及び- 1 }。
    } 
    の場合INT iは= 1 ; I <=全てのi ++ 
        [I] .X = D [i]を.Yで[I] .ID = iは、
    幸いにも( + 1、+ 1 + すべて);
    以下のためにint型私は= 1 ; I <=すべて;私++
    { 
        もし(I == 1!|| [I] .X = [I- 1 ] .X)CNT ++ 
        D [i]は.ID] .Y = CNT。
    } 
    ソート(D + 1、D + 1回の + TOT)。
    以下のためにINT iが= 1 ; I <= TOT; I ++ 
    { 
        場合(D [i]が.ID)[D [i]は.ID] + = DをANS [I] .inv * 得る(D [i]は.Y );
        他のアドオン(D [i]の.Y)。
    } 
    のためのINT iは= 1のprintf(; I <= M I ++)" は%d \ n " 、ANS [I])。
    リターン 0 ; 
}

 

 

 

 

おすすめ

転載: www.cnblogs.com/hsez-cyx/p/12418199.html