資料結構 可持久化權值線段樹

2021-10-08 14:00:35 字數 1482 閱讀 9490

解決靜態區間第k小的問題。

#include

using

namespace std;

const

int maxn =

2e5+5;

int tot, n, m;

int sum[maxn <<5]

, rt[maxn]

, ls[maxn <<5]

, rs[maxn <<5]

;int a[maxn]

, ind[maxn]

, len;

inline

intgetid

(const

int&val)

intbuild

(int l,

int r)

intupdate

(int k,

int l,

int r,

int root)

intquery

(int u,

int v,

int l,

int r,

int k)

inline

void

init()

intmain()

return0;

}

my style

#include

using

namespace std;

//可持久化權值線段樹

const

int maxn =

2e5+5;

struct etree[

20* maxn]

;//tree存的是所有葉子節點

//現在的樹不再是2*i左子樹2*i+1右子樹了,所有子樹都要儲存左右節點在tree裡的編號

struct disa[maxn]

;int tot, root[maxn]

, rk[maxn]

;//cnt代表開了多少葉子節點

//那麼root代表啥?因為每次插入的時候會從根節點開始新加一條鏈

//那麼就相當於多個root節點了,root[i]存的是第i次插入**出來的根在tree裡的下標

bool

cmp(

const dis &x,

const dis &y)

//返回根節點

intupdate

(int l,

int r,

int rt,

int k)

//rt代表需要複製的節點下標

//返回的是那個點的位置

intquery

(int l,

int r,

int x,

int y,

int k)

intmain()

int l, r, k;

while

(m--

)return0;

}

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

主席樹模板題,求n個數中,第l個數到第r個數的第 小的數 includeusing namespace std define mid l r 1 struct node tree 210000 5 主席樹一般開32倍的空間 int a 210000 b 210000 t 210000 cnt int...

模板 可持久化權值線段樹(主席樹)

洛谷3834 主席樹入門題,靜態區間第k小 權值線段樹 一棵線段樹的葉子tree l r 節點記錄序列中滿足a i l r的數的個數,非葉子節點記錄兒子的sum之和 這樣我們就可以快速地求出整個序列的第k小 或第k大 為了能夠查詢區間的第k小,我們在序列1 n的每個位置i建立一棵權值線段樹,那麼對於...

資料結構 離散化 權值線段樹

先介紹一下離散化 桶排大家應該知道,就是開乙個陣列 下標為數值,記錄了該數值的出現次數 然後遍歷過去如果出現次數不為零,那就輸出這些數字,理論時間複雜度可以達到o n 但是由於記憶體限制,不能開很大的陣列。然而 如果某個數列中的數字不要求大小確定,只要求這些數字有相對的大小就夠了的話,離散化就有了用...