題目:給出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區間裡面是要查詢哪個區間的第幾大值。這是要重新算出來的。我們可以利用我們記錄的資訊查出來。
**:
注意2104是肯定沒有重複數字的,但是2761是肯定有的。不考慮的話wa死你。#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;
}
這裡我補充一下為什麼有重複中值會很麻煩,就像資料
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中的所有主機進行廣播,...