Mokia(三次元半順序)P4390

CDQを述べ、千本のナイフトピックを受け、このいまいましい道を言及する必要があります。

ミニマリストの質問が表面化:

Tiはポイントを置く時の二次元平面、(XI、YI)が与えられ、時間TJの数を指すブロックでクエリ

質問を参照してください2次元のツリーラインがああファックので、水?

落胆データ範囲の警告

ほとんどビットの1次元配列はあまり... 1E6 * 1E6のですか?いくつかのGB?

...

だから、偉大な分割統治CDQを果たしました。

実際には、翻訳はこのような問題に直面することがあります。

時間内の挿入点、現在のポイントが数未満である(x、y)と時間点未満に依頼します

そのCDQの事はありませんか?裸のテンプレートのタイトルもさります。

統計は00ポイントからなる大規模な矩形があるので、しかし、あなたは半順序4点をカウントするので、そう、2つの長方形、プラス小さな長方形をカットし、差(2次元差分)を見てみたいことがあり

要約すると、それはCDQです。

最初の時間次元、二次元、X、三次元のY

オフラインで行うようにしてください

だから、快適なCDQを始めました

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 MAXN = 505 ; 

構造体ノード
{ 
    int型の時間、X、Y、ヴァル、ID。
} E [MAXN]。
int型 M、CNT、T [MAXN << 1 ]、[MAXN]は、[MAXN] ANS。
インラインINT lowbit(INT X)
{ 
    戻り X& - X。
} 
ボイド追加(int型のx、int型のY)
{ 
    ため(; X <= Mであり、X + = lowbit(X))
    { 
        T [X] + = Y。
    } 
}
INT(ASK INT X)
{ 
    int型 RES = 0 (; X; X- = lowbit(X))
    { 
        RES + = T [X]。
    } 
    戻りRESと、
} 
ブールCMP2(ノードA、ノードB)
{ 
    場合(AX = BX!)戻り AX < BX。
    もし(!AY =による)リターン <AY によって、
    // それ以外の戻りa.time <b.time。
}
 BOOL CMP(ノードA、ノードB)
{ 
    戻り a.time < b.time。
} 
のボイドCDQ(int型 L、INT R)
{ 
    場合(L == R)のリターン;
    INT半ば= L + R >> 1 
    CDQ(L、MID)。
    CDQ(MID + 1 、R)。
    ソート(E + L、E + 1 + R、CMP2)。
    以下のためにint型私はLを=; I <= R; iが++ 
    { 
        場合(E [I] .X <=ミッド&& E [I] .ID == 0 
        (Eを追加[I]・Y、E [I] .val ); 
        他の E [i]は.val + = ([I] .Y e)を尋ねます。
    } 
    のためにint型 I = 1と、iが<= R; iは++ 
    {
        もし(E [I] .X <=ミッド&&のE [I] .ID == 0 
        を追加(E [I] .Y、 - E [I] .val)。
    } 
} 
int型)(読み取り
{ 
    int型の F = 1、X = 0チャー S = GETCHAR()。
    一方、(S> ' 9 ' || S < ' 0 '){ もし、(S == ' - ')、F = - 1 ; S = GETCHAR();}
     一方、(S <= ' 9 ' && S> = ' 0 "S- + ' 0 ' ; S = GETCHAR();}
     戻りのx *のF。
} 
int型のmain()
{ 
    (読み取り)
    M = 読み取ります();
    int型フラグ= 読み取ります();
    ながら(!=フラグ3 
    { 
        場合(フラグ== 1 
        { 
            int型のx =リード()+ 1、yが読み出さ=()+ 1、ヴァル= 読み取ります(); 
            E [ ++ CNT] =(ノード){CNT、X、Y、ヴァル、0 }。
        } 
        
        { 
            INT)(= X1を読み出す、YL =読む()、X2 =読む()+ 1、Y2 =読む()+ 1 ; 
            E [ ++ CNT] =(ノード){CNT、X1、YL、01 }。 //データ構造
            E [ ++ CNT] =(ノード){CNT、X2、Y2、01 }、
            E [ ++ CNT] =(ノード){CNT、X2、YL、01 }。
            E [ ++ CNT] =(ノード){CNT、X1、Y2、01。;} 
        } 
        フラグに = ;リード()
    } 
    CDQ(1 、CNT);およびライン上のハードCDQ 
    ソート(E + 1、E + + CNT 1、CMP)。
    int型 i = 1 ; iが= CNTを<; ++ i)は
    、{ 
        もし、(E [I] .ID == 1 
        { 
            のprintf(" %d個の\ n "、E [I] .val + E [I + 1 ] .val-E [I + 2 ] .val-E [I + 3 ] .val)。
            I + = 3 ; 
        } 
    } 
    戻り 0 
}

(終わり)

おすすめ

転載: www.cnblogs.com/ajmddzp/p/11300115.html