劃分樹詳解

2021-06-23 01:41:41 字數 2118 閱讀 9469

題目:給出n個數,和m個區間 ,對於每個區間 [ l , r ] ,輸出這個區間裡面第k大的數。

我們來看看劃分樹是怎麼構造的。^_^

構造

以2104為例子,舉2 0 6 8 5 1 4 3 9為例子,構造劃分樹是這樣的

上面的內容是用乙個二位陣列val儲存下來的,第一維表示劃分樹的第幾層,第二位表示在這一層中的位置。要注意的是,每一層不僅僅儲存乙個子樹,就像上圖中的2 0 6 8 5 1 4 3 9派生的左右子樹2 0 1 4 3和6 8 5 9是在同一層的。另外我們還要儲存下整體排序好的序列,記為st。

構造劃分樹的時候,對於每乙個區間,我們找出這個區間的中值mid。是中值,不是中間的值。然後我們讓小於中值的所有數劃分到左子樹,讓大於中值的數都到右子樹,注意在子樹裡面維持原來的相對次序!如果只有乙個中值,因為中值位於(left+right)>>1,而這個位置是屬於左區間的,所以劃分到左子樹。但如果有不止乙個中值這就不好辦了。

這裡我們先討論只有乙個中值我們怎麼實現上面的步驟。區間 [ left , right ] 位於cen層的話,兩個子區間就位於cen+1層,而且左右相鄰,合起來跟原來的區間等長的,左區間起點是left,右區間起點是 (left+right)/2+1,由此,一開始弄兩個變數ll,rr指向這兩位置,在原來的區間從左往右掃瞄,遇到小於等於中值的,就放到左區間變數 ll 指向的地方,變數 ll 後移一位。右區間的類似移動變數 rr。這樣就可以啦。

然後我們在討論又不止乙個中值的情況。我們在st對應的[left,right]裡面找出這個區間的左子區間裡面有多少個跟中值相同的,發現有x個。那麼也就是說到時候會有x個中值要放到左子樹。我們也像上面一樣掃瞄,掃到中值本身,我們直接放到左子樹,如果左子樹的中值已經放滿了x個,那就改放到右子樹。

上面說到的是劃分過程。你會發現劃分的最後,最後一層的序列跟st是一模一樣的。

另外,我們在構造劃分樹的時候,我們還要儲存下,從區間起點left開始到當前點,一共有多少個點被放到了右子區間,這個點本身是否被放到了右子區間。這個是方便後面查詢用的。如下圖紫色的數字。

查詢

在x的區間 [ x.left , x.right ] 查詢子區間 [ left , right ] 的第k大值

首先算出[ left , right ] 裡面有多少個數(記為dif)被分到了左子樹,利用上圖紫色數字記錄的資訊。

如果dif<=k,說明這個第k大值在下一層是被分到了右子樹,然後我們就到右子樹找,否則就到左子樹找。

在右子樹找,就是到2x的區間裡面找,我們就需要算出我們在2x區間裡面是要查詢哪個區間的第幾大值。這是要重新算出來的。我們可以利用我們記錄的資訊查出來。

**:

#include#include#define n 100100

using namespace std;

struct node

a[n*4];

struct tree//tree是記錄劃分的每一層的結果

tree[20][n];//注意2^20要大於n

int st[n];

void build(int left,int right,int cen,int t)

//記錄下這個區間的左子區間裡面有多少個重複的中值。

//也就是重複的中值有多少個要擺到左子區間去。

for(j=left;j<=right;j++)

else

}else if(v=k)

else

}int main()

sort(st+1,st+1+n);

build(1,n,1,1);

while(m--)

}return 0;

}

注意2104是肯定沒有重複數字的,但是2761是肯定有的。不考慮的話wa死你。

這裡我補充一下為什麼有重複中值會很麻煩,就像資料

input:

4 11 8 6 6

1 4 4

output:

8如果我們構造的時候不小心考慮,如果一股腦的把全部中值都放到左子區間,會溢位,過程:(中值是6)遇到1我們放在下一層的第一位,遇到8我們發到下一層的第3位,遇到6我們放在下一層的第2位,遇到第四個6,我們就順勢把這個6放到了第3位了,這樣就覆蓋了原來的8。所以這裡要注意!!

子網劃分詳解

首先了解一下 ip位址使用規則 網路號全為0 的位址保留,不能作為標識網路使用 主機號全為0 的位址保留,作為表示網路位址 網路號全為1 節點號全為 0的位址表示子網掩碼 主機號全為1 的位址為廣播位址,如172.16.255.255 稱為直接廣播或定向廣播,表示對 172.16.0.0 中的所有主...

子網劃分詳解

ipv4位址如果只使用有類 a b c類 來劃分,會造成大量的浪費或者不夠用,為了解決這個問題,可以在有類網路的基礎上,通過對ip位址的主機號進行再劃分,把一部分劃入網路號,就能劃分各種型別大小的網路了。為了解決ipv4的不足,提高網路劃分的靈活性,誕生了兩種非常重要的技術,那就是vlsm 可變長子...

子網劃分詳解

首先了解一下 ip位址使用規則 網路號全為0的位址保留,不能作為標識網路使用 主機號全為0的位址保留,作為表示網路位址 網路號全為1,節點號全為0的位址表示子網掩碼 主機號全為1的位址為廣播位址,如172.16.255.255,稱為直接廣播或定向廣播,表示對172.16.0.0中的所有主機進行廣播,...