主席樹 可持久化線段樹

2022-03-30 07:29:39 字數 918 閱讀 7338

//

主席樹 可持久化線段樹

//對於每次更新新建根節點

//將涉及到改變的節點全部新建,未涉及改變的節點全部用以前的節點代替

//可大大節省空間

#include#include

#include

#include

#include

#include

using

namespace

std;

int n,m,cnt,root[1000001],a[1000001

];struct

uiotree[

20000001

];void build(int l,int r,int &now)

int mid=(l+r)/2

; build(l,mid,tree[now].ls);

build(mid+1

,r,tree[now].rs);

}void update(int l,int r,int pos,int k,int &now,int last)//

左右兒子,修改位置下標,修改值,新建版本root,查詢版本root

int mid=(l+r)/2

;

if(pos<=mid)

update(l,mid,pos,k,tree[now].ls,tree[last].ls);

else update(mid+1

,r,pos,k,tree[now].rs,tree[last].rs);

}int query(int l,int r,int pos,int

last)

void

do_something()

else

} }int

main()

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

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

主席樹 可持久化線段樹

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

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

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