突然想起主席樹。
依稀只記得演算法的大概了,所以今天又拿出來溫習了一下,畢竟學習演算法是很快的,忘掉也是很快的,而演算法一定是要運用的,否則也就沒有存在的意義了。
首先主席樹是一棵線段樹,而且是乙個字首權值線段樹,支援靜態的查詢。這個演算法最大的亮點就是在原有的一棵樹的基礎上,如果想將乙個元素插入,就根據它的權值在原有的樹一路搜尋,並在搜尋的同時開一塊新的空間,作為新的樹的乙個節點,然後將節點的資訊繼承過來,如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 建立出一顆線段樹維護值域上每個數的出現次數,然後發現這樣的樹是可以減的,然後就沒有然後了 其實...