線段樹初步 可持久化線段樹

2021-08-20 19:05:35 字數 1773 閱讀 7974

人的知識就好比乙個圓圈,圓圈裡面是已知的,圓圈外面是未知的。你知道得越多,圓圈也就越大,你不知道的也就越多。——芝諾

線段樹以其特點能被用來解決許多的問題,其拓展性極強。故學好、用好線段樹對增加你的**長度有顯著作用。這篇簡小的文章,就來講一講線段樹的一種變式——可持久化線段樹(又作主席樹、函式式線段樹等)。

先來說一下思想。線段樹作為乙個二叉樹,在其高效的時間效率之外,空間冗餘顯得不可忽視。一些時候,由於題目中需要尋找資料的區間如火般跳動,線段樹常常不是乙個,而是連續的很多個。它們出現的順序普遍是下標,形象一點就是時間順序。常常是後面的包含前面,但每往後乙個,它都會增加一些內容。這時,建立多個是不可免的,空間的需求也快速增加。常常,簡單的思想成就了偉大事物的出現。講到這裡,字首和當然就迫不及待地從意識中鑽了出來。可持久化的意義也隨之而來:我們將每一棵新的線段樹建在其前輩的高台上。最終辦法是:用相同的子樹表示相同的部分,即將一條鏈連過去;用不同的新的小的子樹表示不同的部分,即增加一條不大的鏈。

例題-easy

source poj2104

給出長度為10w的序列及5k個對於指定區間內第k大的數的詢問。

solution

小學老師曾經說過,對於找規律的題目,不要慌張,不要著急,要從最簡單的開始找。所以我們先拋開跳動的區間,對於這輸入樣例整個地來看。首先,要找第k大的數,必定會想到權值線段樹。這樣的話,如果右子節點的權值大於等於k,就過去找;反之,就去左邊找。找到的根節點就是第k大的數。

現在,我們腳踏家園,放眼世界。對於跳動的區間,根據我們偉大的思想,有這樣的發現:要某區間的權值線段樹,每個節點的值就是它在[1,r]這棵樹中的值減去它在[1,l-1]這棵樹中的值。每次查詢減一下就是我們需要的這棵樹的值了。儘管我們並沒建這棵樹,卻可以用極高的效率間接得出它的資訊。

在實現的時候,由於資料的不可**性,建議使用離散化的資料。建樹的過程是這樣的:首先,對於每個[1,n]的樹,分配乙個根節點,它直接複製上乙個根節點的資訊;其次,分配時相當於我們新增了乙個數,由於這個節點連線的是上個版本可用的資訊,我們只需替換修改的那一條鏈,具體操作和普通權值線段樹相似。

code for reference

#include#include#includeusing namespace std;

const int n=100005;

struct node

;struct num

;node tree[n*20];

int tot=0;

num a[n];

int n,m;

int b[n];

int root[n];

bool cmp(num x,num y)

int query(int i,int j,int k,int l,int r)

int main()

sort(a+1,a+n+1,cmp);

for(int i=1;i<=n;++i)

for(int i=1;i<=n;++i)

int x,y,z;

for(int i=1;i<=m;++i)

return 0;

}

hint

這個龐大的樹的空間大概要開數十倍之資料。

我的讀入優化出現了小問題,導致無數次runtime error。

思考題-easy

source cqoi2015 luogu3168

例題-normal

source bzoj1901/zoj2112

給出長度為5w的序列及1w個對於指定區間內第k大的數的詢問或對指定數的修改。

solution

可持久化線段樹初步

可持久化線段樹是可以查詢歷史版本的資料結構,比如說查詢區間第k大的數,那麼我們需要查詢到1 r 和 1 l 1 資料的分布情況,以完成查詢。2015年11月25日 模板題 poj2104 1 include 2 include 3 include 4 define rep i,a,b for int...

可持久化線段樹總結(可持久化線段樹,線段樹)

最近正在學習一種資料結構 可持久化線段樹。看了網上的許多部落格,弄了幾道模板題,思路有點亂了,所以還是來總結整理下吧。你需要維護這樣的乙個長度為 n 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,即為生成乙個完全一...

線段樹,可持久化線段樹,主席樹

線段樹板子題 另乙個板子 線段樹就是對於給定的乙個序列,我們按照不斷取中點的方式建立一顆二叉樹,該樹的每個節點都代表乙個區間,也就是序列的下標,這樣我們就可以借助這些下標來維護某些我們需要的值,例如 某個區間的最大值,某個區間的和等等。同理也可以像差分那樣對某個區間進行操作。可持久化線段樹板子 主席...