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

2021-07-10 22:11:44 字數 555 閱讀 7183

我真弱。。。連主席樹都不會。。。

主席樹相當於多個線段樹,由於相鄰兩棵線段樹的節點的值只有少許不同,因此可以對於和前一棵樹一樣的子樹乙個指標指過去,無需操作,這樣每棵樹o(logn),總複雜度o(nlogn)。

以下是區間k大**:

#include#include#include#define n 100005

#define m 4000000

using namespace std;

int n,m,a[n],b[n],c[n],cnt,root[n],l[m],r[m],v[m],len,x,y,k;

bool cmp(int x,int y)

int qry(int x,int y,int k)

else

} return l;

}int main()

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

add(1,cnt,root[i-1],root[i],c[i]);

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

}

主席樹 可持久化線段樹

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

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

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

主席樹 可持久化線段樹

主席樹,即可持久化線段樹。可持久化 可以找到每次修改時的線段樹,即儲存了線段樹各個歷史版本,這樣就可以快速查詢到第 i 次修改前線段樹的狀態。核心思想 與歷史版本的線段樹共用部分結點。很明顯每次新建一棵線段樹帶來的時空消耗是難以承受的,但是可以發現,每次單點修改時,只會變動logn個結點 即從根結點...