求區間第k大

2021-10-06 02:04:19 字數 817 閱讀 3684

int a[mx]

;void

insert

(int a,

int l,

int r)

}int

divide

(int a,

int l,

int r)

//劃分子問題

a[l]

= x;

return l;

}int

select

(int s,

int l,

int r,

int k,

int len)

//返回s陣列l~r的第k大數的下標

while(1

)//從集合m中選出中位數m*(遞迴)

//以m*作為基準元素,劃分子問題,這裡直接將m*換到區間左端點,依然是為了方便計算

int tag =

select

(s,l,l+n/r-

1,n/r/

2+n/r%

2,len)

;swap

(s[l]

,s[tag]);

tag =

divide

(s,l,r);if

(tag-l+

1==k)

return tag;

else

if(tag-l+

1>k) r=tag-1;

else k-

=(tag-l+1)

,l=tag+1;

}}signed

main()

主席樹求區間第k大

主席樹是可持久化線段樹,維護 權值個數 線段樹的字首和。相當於對每個區間 1,i 建立n顆線段樹。我們用乙個區間內的數的出現個數建線段樹,所以資料大小較大時一般進行離散化。建的是權值線段樹,即用數值作為區間,每個節點存該數出現的次數,所以query返回的其實是離散後的陣列b的下標idx,最終結果為b...

區間第k大

問題描述 給定乙個序列,每次詢問序列中第l個數到第r個數中第k大的數是哪個。輸入格式 第一行包含乙個數n,表示序列長度。第二行包含n個正整數,表示給定的序列。第三個包含乙個正整數m,表示詢問個數。接下來m行,每行三個數l,r,k,表示詢問序列從左往右第l個數到第r個數中,從大往小第k大的數是哪個。序...

區間第k大

歸併樹 include include include include include include include include include include include define ll long long define max x,y x y x y define min x,y ...