學習總結 主席樹

2021-07-29 09:00:44 字數 1147 閱讀 9519

突然想起主席樹。

依稀只記得演算法的大概了,所以今天又拿出來溫習了一下,畢竟學習演算法是很快的,忘掉也是很快的,而演算法一定是要運用的,否則也就沒有存在的意義了。

首先主席樹是一棵線段樹,而且是乙個字首權值線段樹,支援靜態的查詢。這個演算法最大的亮點就是在原有的一棵樹的基礎上,如果想將乙個元素插入,就根據它的權值在原有的樹一路搜尋,並在搜尋的同時開一塊新的空間,作為新的樹的乙個節點,然後將節點的資訊繼承過來,如l、r、sum等,並進行更新。這樣一直遞迴下去,新的樹就建好了。(我承認還是不太清楚,就詳見**吧)。

題目:有乙個序列,m次詢問,求[l,r]範圍中第k大的值是多少。

#include

#include

#include

#include

using namespace std;

#define m 30005

int a[m],b[m];

int t[m*14];//防止下標越界

int n,m;

int tot;

struct treetr[m*14];

void build(int l,int r,int &id)

void ins(int l,int r,int v,int ot,int &id)

int find(int l,int r,int ot,int nt,int k)

}tr;

int main()

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

int sz=unique(b+1,b+n+1)-b-1;

for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+sz+1,a[i])-b;

tr.build(1,sz,t[0]);

for(int i=1;i<=n;i++)tr.ins(1,sz,a[i],t[i-1],t[i]);

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

return

0;}

其實**就是在做一件事,對於每乙個元素的插入都建一棵樹,只不過大部分資訊是從上一棵樹轉移過來的。

對於一些靜態查詢的題目,主席樹還是有一定的奇效的(不得不說,線段樹還是比較無敵(nao)的)。

最後還是希望這些厲害的演算法為我所用,不要在寫題目的時候只有暴力向我揮手。

靜態主席樹學習總結(詳細)

菜雞這兩天學了靜態主席樹,看了好多大佬的 和解釋 終於看懂了!在此寫乙個菜雞詳細版的靜態主席樹總結o o 主席樹也稱函式式線段樹也稱可持久化線段樹。求任意區間 l,r 的第k大數。假設這個區間是 1,r 1 我們若每次求區間 1,r 的第k大數,則用權值線段樹可求解,即從根節點開始向下遞迴,若左子節...

主席樹題目總結

前置知識 基於值域的整體第k大 權值線段樹 寫主席樹必定需要注意空間的開銷,一定要開夠 若長度為n,修改為m次,則空間複雜度為n m logn。可以在我的部落格裡翻一翻2333。基礎問題,求解區間第k大,或者區間小於等於k的個數 poj 2104 hdu 4417 下面兩個前置知識lca p2633...

主席樹學習記錄

搞了一段時間網路流後,最後還是回到了資料結構。主席樹,引fotile主席的一段話 這個東西是當初我弱不會劃分樹的時候寫出來替代的乙個玩意.被 有用心的人取了很奇怪的名字 想法是對原序列的每乙個字首 1.i 建立出一顆線段樹維護值域上每個數的出現次數,然後發現這樣的樹是可以減的,然後就沒有然後了 其實...