主席樹 模板

2021-08-04 13:33:08 字數 1224 閱讀 3899

思想:主席樹就是一顆持久化線段樹, 為什麼叫持久化了, 因為它可以儲存之前的線段樹版本, 並且可以拿來用, 從而優化空間. (至於為什麼叫主席樹了, 大概是因為發明這個演算法的人的名字的緣故吧….)

詳細說說:

主席樹是一種離線資料結構,是由很多棵線段樹組成的。

第i棵線段樹存的是前i個數的資訊:

每乙個線段存數字的出現次數(因此建樹之前要離散化)。

那麼n棵線段樹不會mle嗎? 肯定會了!

但是我們發現第i棵線段樹和第i-1棵線段樹是非常相似的,有許多結點完全相同,因此可以借用之前的結點,沒必要新建結點. 從而優化了空間.

模板題題意: 求區間第k大.

思路: 建一顆權值主席樹, 每次統計出乙個區間中出現的次數, 然後對於這個區間我們可以通過判斷與k的關係, 從而找出第k大.

const

int maxn = 1e5+5;

int n, m;

struct tree tree[maxn*40];

int idx = 0, root[maxn];

int build(int l, int r)

int update(int pre, int l, int r, int pos, int val)

int query(int ql, int qr, int l, int r, int k)

vector

ve;int getid(int x)

int a[maxn];

void solve()

sort(ve.begin(), ve.end());

ve.erase(unique(ve.begin(), ve.end()), ve.end());

root[0] = build(1, sz(ve)); //根節點

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

while (m--)

}

主席樹可以解決的經典問題:

1: 區間第k大上面的**poj-2104

2: 區間中不同數的個數 spoj-dquery

3: 區間中比某個數小的個數(或者和)或者小於某個數的最大的數是多少個數hdu-4417

和的hdu-6162 (不過要套樹剖)

4: 維護可持久化陣列模板題洛谷 - 3919

5: 既然可以做第4點, 那麼就可以做可持久化並查集模板題洛谷 - 3402

主席樹模板

維護n棵1 i的字首權值線段樹,每次查詢減一下就好了。poj 2104就是模板題,裸的靜態第k大,需要先離散化,不會的就用lower bound 多試試,研究研究應該就能懂。include include include include using namespace std const int m...

模板 主席樹

譴責奶人的hsz巨神 靜態版本 求區間第k大 可持久化也沒那麼高大上嘛,主席樹本質上就是多棵線段樹,求第k大就類似平衡樹的第k大。stay foolish,stay hungry,stay young,stay include include include include using namesp...

主席樹模板

jscpc被坑,努力學習。主席樹又稱可持續化線段樹,具體的可以看其他人部落格。這裡僅上一題。題目大意 給n個數,編號1 n,給m個詢問,每次詢問編號 l,r 中第k大數為多少。題解 include include include include include includeusing namesp...