主席樹板子(可持久化線段樹)

2021-09-14 00:10:48 字數 1292 閱讀 5052

主席樹寫的比較好的部落格:

題目描述:靜態區間l,r的最小值。

方法:離散化輸入陣列,以離散化之後的陣列建立多顆線段樹。因為資料為離散化之後的滿足單調,直接查詢就可。

問題一:何為離散化????

(其實我也不知道) 把靜態區間排序,去重之後剩餘的即為離散化之後的陣列。此操作建議使用c++中stl。

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

q=unique(b+1,b+n+1)-b-1;//強大的stl

問題二:開多顆線段樹不會mle????

這就利用了可持久化的原理,因為每棵線段樹和前一顆線段樹有共同的空間,直接連邊即可。

一: 我們,以第零個節點為初始,構建乙個長度為離散化b陣列長度的空線段樹

inline void build(int &k,int l,int r)
二:進行點修改

for(register int i=1;i<=n;i++)
(點修改函式)modify 函式

inline int modify(int k,int l,int r)
因為主席樹可以進行加減操作,在查詢l,r區間時,利用字首和的思想,r修改以後的線段樹,和l-1修改以後的線段樹之間的排名為k。

inline int query(int u,int v,int l,int r,int k)
全部**

#include#include#includeusing namespace std;

const int n=2*(1e5+7);

int n,m,rt[n<<5],lc[n<<5],rc[n<<5],a[n],b[n],sum[n<<5];

int q,node_cnt=0,p;

inline void build(int &k,int l,int r)

inline int modify(int k,int l,int r)

inline int query(int u,int v,int l,int r,int k)

int main()

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

q=unique(b+1,b+n+1)-b-1;

build(rt[0],1,q);

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

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

return 0;

}

主席樹(可持久化線段樹)

我真弱。連主席樹都不會。主席樹相當於多個線段樹,由於相鄰兩棵線段樹的節點的值只有少許不同,因此可以對於和前一棵樹一樣的子樹乙個指標指過去,無需操作,這樣每棵樹o logn 總複雜度o nlogn 以下是區間k大 include include include define n 100005 defi...

主席樹 可持久化線段樹

首先要學會普通的線段樹,然後理解權值線段樹,而主席樹就是多個權值線段樹 我自己的理解 但是這多個權值線段樹之間有公共部分,節約了空間。它一開始是乙個空樹,後來逐個添數,記錄新增的這個數在那個範圍內,並 1,顯然它每次只更新了一條鏈,其他不需要變,這樣就有了多個版本的線段樹。如果求 l,r 範圍內第k...

可持久化線段樹(主席樹)

qwq我大概又是機房最後乙個學主席樹的了吧 其實之前一直都在講 只是沒做題 做了幾道以後發現都是乙個套路qwq關鍵就是能不能看出來要用主席樹 主要可以解決 靜態 動態區間第k大 樹上也可以 一些有關區間的帶某些限制的詢問 如出現次數等 先把模板粘上來 include include include ...