首先要學會普通的線段樹,然後理解權值線段樹,而主席樹就是多個權值線段樹(我自己的理解),但是這多個權值線段樹之間有公共部分,節約了空間。它一開始是乙個空樹,後來逐個添數,記錄新增的這個數在那個範圍內,並+1,顯然它每次只更新了一條鏈,其他不需要變,這樣就有了多個版本的線段樹。如果求[l,r]範圍內第k大個數,那麼只需要在t[l]-t[r+1]的線段樹中尋找第k個數的位置即可。
poj2104
#include
#include
#include
#include
using
namespace
std;
const
int maxn=2e5+10;
const
int maxm=maxn*20;
int n,q,m;
int t[maxn],a[maxn];
int t[maxn];
int lson[maxm],rson[maxm],c[maxm];
int tot;
void init()
void init_hash()
int get(int x)
int build(int l,int r)
//printf("%d %d %d\n",l,r,root);
return root;
}int update(int root,int pos,int v)
else
c[newroot]=c[root]+v;
}//printf("%d\n",tem);
return tem;
}int query(int left_root,int right_root,int k)
else
}//printf("%d\n",l);
return l;
}int main()
while(q--)
}return
0;}
主席樹(可持久化線段樹)
我真弱。連主席樹都不會。主席樹相當於多個線段樹,由於相鄰兩棵線段樹的節點的值只有少許不同,因此可以對於和前一棵樹一樣的子樹乙個指標指過去,無需操作,這樣每棵樹o logn 總複雜度o nlogn 以下是區間k大 include include include define n 100005 defi...
可持久化線段樹(主席樹)
qwq我大概又是機房最後乙個學主席樹的了吧 其實之前一直都在講 只是沒做題 做了幾道以後發現都是乙個套路qwq關鍵就是能不能看出來要用主席樹 主要可以解決 靜態 動態區間第k大 樹上也可以 一些有關區間的帶某些限制的詢問 如出現次數等 先把模板粘上來 include include include ...
主席樹 可持久化線段樹
主席樹,即可持久化線段樹。可持久化 可以找到每次修改時的線段樹,即儲存了線段樹各個歷史版本,這樣就可以快速查詢到第 i 次修改前線段樹的狀態。核心思想 與歷史版本的線段樹共用部分結點。很明顯每次新建一棵線段樹帶來的時空消耗是難以承受的,但是可以發現,每次單點修改時,只會變動logn個結點 即從根結點...