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 ...