解決靜態區間第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 但是由於記憶體限制,不能開很大的陣列。然而 如果某個數列中的數字不要求大小確定,只要求這些數字有相對的大小就夠了的話,離散化就有了用...