羅区P3834 [テンプレート]ツリーライン1(ツリーの議長)議長ツリーを保持することができ

URL:https://www.luogu.org/problem/P3834

質問の意味:

$ N-数は$ K小$の$、$ M $問合せ、問合せ間隔$ Lが$〜$器R $与えられます。

ソリューション:

重み値セグメントツリーを確立し、ノードセグメントツリーに格納されているサブツリーの異なる数の数であり、その後に間隔の$ [1、k]は$、$ K \(1、N)$確立セグメントのツリー、明らかに間隔$ [1、R] - [1、L-1] $は、間隔の必要数の数では、クエリは、この範囲内とすることができます。特定のコードで参照してください。

ACコード:

書式#include <iostreamの> 
の#include <CStringの> 
の#include <アルゴリズム> 
std名前空間を使用しました。
#define MAXN 200005 
構造体値
{ 
    int型のID。
    int型のx; 
}。
値v [MAXN]。
[MAXN]ハッシングint型。
BOOL CMP(constの値と、constの値&B)
{ 
    戻りAX <BX。
} 
int型のCNT = 0。
構造体cheiftree 
{ 
    構造体ノード
    { 
        int型のL、R; // L、R记录节点编号而不是区间长の
        INT和; 
        ノード()
        { 
            和= 0。
        } 
    }。
    ノードTR [MAXN * 20]。
    int型のルート[MAXN]。
    INITを無効()
    { 
        CNT = 1; //カウントルート
        TR [0] .L = TR [ 0] .R = TR [0] .SUM = 0; // 重み周りの子どもたちが0に初期化され
        たルートを[0] = 0; //ルート0に初期化       
    } 
    // L、mは間隔の範囲を表す空隙更新(R&LT INT、INT&NRTは、INT NUM int型L)
    { 
        //新しいツリー; TR [CNT ++] = TR [NRT]を単位根、この場合にはルートを表したNRT [-I 1] 
        NRT = CNT-1; // CNT-1はルートに割り当てられている[i]はタグ番号のルートである
        ++ TR [NRT] .SUM; / /新しい番号+1のすなわち数を渡す重みの数、すなわち、根の数+ 1 [-I 1] 
        式中、Rは&LT == L)//リーフノードに到達した場合
            返す; 
        int型のM =(L + R&LTを)/ 2; //中点演算部
        IF(NUM <= m)の
            更新(L、M、TR [NRT] .L、NUM);現在の着信の左の子の//ルート
            更新参照が使用されるので// 、それは、上の親ノードの左の子に連結される
        他の
            更新(1 + Mは、R、TR [NRT] .R、NUM); 
            //同様に右の子 
    }
    int型の照会(INT RL、INT RR 、INT K、int型のL、INT R)// RL iは前に木を指し、RR jは前に木を指し、kはk番目の最大を意味し、LとRの範囲を意味する
    { 
        int型D = TR [TR [RR] .L] .SUM -TR [TR [RL] .L] .SUM; // 最初の着信RL及びRRは、ルートのルートである[1]及びルート[B]、およびTR [RR ] .L及びTR [RL] .Lは、両者のルートの子を残し、dはこの体重範囲(すなわち、数時間の最大値)の最大値の前半を表し
        (R&LT == L)IF 
            リターンL; 
        INT M =を( R&LT + L)/ 2; 
        IF(K <= D)は
            //ここでK、クエリ(TR .L、TR [RR] .L、K、L、M)RLである]を返す
        他は
            TR [RLである(クエリを返すを] .R、TR [RR] .R 、KD、M + 1、R); // kは最大優先値よりも大きい
    } 
}; 
cheiftree CT; 
int型のmain()
{ 
    int型N-、M、
    IOSの:: sync_with_stdio(0) ; 
    cin.tie(0); 
    CIN >> N-M; 
    //離散
    用(INT I = 1; I <= N - 、Iは++)
        CIN >> V [I] .X、V [I]は=私は.ID、
    ソート(1 + Vに、V + 1 +、N-、CMP。); 
    以下のための(int型I = 1; I <= N; I ++は)
        ハッシュ[V [I] .ID] = I; 
    //社長ツリー
    ct.init(); 
    のため(int型I = 1; I <= N-;私は++)
    { 
        ct.root [I] = ct.root [-I 1。]; 
        値は毎回添加する//場合、ct.update(1、nは、ct.rootを [I]、ハッシュ[i])と新しいツリーを構築し、新しいノードがツリー内の重みの値に加算される
    } 
    int型A、B、Kは、
    のために(; iがm <I ++はI = 0 INT)
    { 
        CIN >> A >> B >> K ; 
        //v[i].id=b,hash[v[i].id]=c => V [C] = V [ハッシュ[V [I] .ID] = V [I]; 
        COUT < <V [ct.query(ct.root [A -1]、ct.root [B]、K、1、N)]×<< ENDL ;. // ハッシュの問合せ間隔k番目の最大値、次に逆リリース真値
    } 
    戻り0; 
}

 

おすすめ

転載: www.cnblogs.com/Aya-Uchida/p/11247303.html