樹狀陣列已經夠神奇了,原來它還可以求第k小的元素........orz,位運算v5!
#define n (1<<20)
int c[n],rank[n],fa[n];
int n,m;
void init(){
int i;
for(i=1;i=0;i--){//把樹狀陣列的求和反向模擬,
ans += (1<=n || cnt+c[ans]>=k)ans -= (1<
補充:樹狀陣列實現查詢k小的元素
回顧樹狀陣列的定義,注意到有如下兩條性質:
一,c[ans]=sum of a[ans-lowbit(ans)+1 ... ans];
二,當ans=2^k時,
c[ans]=sum of a[1 ... ans];
下面說明findk(k)如何運作:
1,設定邊界條件ans,ans'其實這個演算法就是將樹狀陣列的求和反向........
因此findk(k)的實質就是二分逼近。
#define n (1<<20)
int c[n];
//複雜度log(n)
int find_k(int k){
int ans = 0,cnt = 0;
for(int i=20;i>=0;i--){//把樹狀陣列的求和反向模擬,
ans += (1<=n || cnt+c[ans]>=k)ans -= (1<
POJ 2985 並查集 樹狀陣列第K大
poj 2985 並查集 樹狀陣列第k大 題目鏈結 題意 給你貓的編號1 n,m次操作,0操作可以把兩隻貓放到一組,1操作詢問貓的當前第k大組的容量是多少。思路 首先0操作可以利用並查集的合併操作,用乙個size陣列紀錄組的容量,每次合併的時候就更新size,那麼查詢第k大用什麼來記錄呢?主席樹?不...
第k小整數(樹狀陣列)
洛谷傳送門 入門難度。沒錯,但是我並不是要暴力做。而是用樹狀陣列來做。先離散化,然後隨便搞一搞就可以了。暈。比暴力還慢 如果要查詢某一區間的的話可以把區間取出重新建樹,然後再求。更暴力 1 include 2 include 3 include 4 define n 10001 5 define l...
線段樹 樹狀陣列 並查集
利用線段樹十分方便的處理區間,線段樹是一棵完美的二叉樹,樹上的每乙個節點都維護乙個區間,根維護的是整個區間,線段樹通常用來計算區間內資料的和或者是修改某處的值。對區間的操作可以再o logn 的時間內完成。下面我們通過 實現線段樹的構建,修改,區間求和。include include 線段樹 def...