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; }