//主席樹 可持久化線段樹
//對於每次更新新建根節點
//將涉及到改變的節點全部新建,未涉及改變的節點全部用以前的節點代替
//可大大節省空間
#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 ...