樹狀陣列求第k小 並查集 POJ 2985

2021-06-04 18:25:49 字數 716 閱讀 6427

樹狀陣列已經夠神奇了,原來它還可以求第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...