權值線段樹

2022-05-03 10:54:19 字數 1354 閱讀 4647

權值線段樹的功能有

基於線段樹和二分的思想

即定義\(int \ tree[maxn];\)

tree[i]表示某段區間數字出現的次數

一般需要離散化操作

void update(int l,int r,int rt,int x,int op)

int mid = (l + r) >> 1;

if(x <= mid)update(lson,x,op);

else update(rson,x,op);

pushup(rt);

}

int find(int l,int r,int rt,int x)
int find2(int l,int r,int rt,int l,int r)
只需要知道右節點數字出現的次數即可

權值線段樹是查詢整個區間的,主席樹是對於區間查詢第k值的

int kth(int l,int r,int rt,int k)
#include #include #define ls(rt) rt<<1

#define rs(rt) rt<<1|1

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

using namespace std;

const int maxn = 1e5 + 5;

int tree[maxn >> 2];//下標是數字,tree[i]某段區間數字出現的次數

void pushup(int rt)

void update(int l,int r,int rt,int x,int op)

int mid = (l + r) >> 1;

if(x <= mid)update(lson,x,op);

else update(rson,x,op);

pushup(rt);

}int find(int l,int r,int rt,int x)

int find2(int l,int r,int rt,int l,int r)

int kth(int l,int r,int rt,int k)

// int rank(int l,int r,int rt,int x)

// int pre(int l,int r,int rt,int x)

// int ore(int l,int r,int rt,int x)

int n;

int main()

return 0;

}

權值線段樹

維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性k小值,全域性rank,前驅,後繼等。單詞操作時間複雜度為o logn 空間複雜度為o n 相對於平衡樹的優勢 簡單,速度快 劣勢 值域較大時,我們需要離散化,變成離線資料結構 我認為...

權值線段樹

include using namespace std int n,m,tre 10003 4 laz 10003 4 void pushdown int num void update int num,int le,int ri,int x,int y,int z pushdown num int...

權值線段樹

權值線段樹是線段樹的一種,但是它與線段樹不同 線段樹的每個結點是用來維護一段區間的最大值或總和 而權值線段樹的每個結點儲存的一段區間有多少個數 權值線段樹主要用來查詢區間第k大或者第k小的值 現在有乙個陣列x 10 對陣列排序後為x 10 每個數的個數如下 1 32 2 3 24 1 5 18 1 ...