權值線段樹

2021-09-26 14:21:33 字數 597 閱讀 1497

權值線段樹是線段樹的一種,但是它與線段樹不同;

線段樹的每個結點是用來維護一段區間的最大值或總和;

而權值線段樹的每個結點儲存的一段區間有多少個數;

權值線段樹主要用來查詢區間第k大或者第k小的值;

現在有乙個陣列x[10]=;

對陣列排序後為x[10]=;

每個數的個數如下:

1:32:2

3:24:1

5:18:1

構建權值線段樹如下圖

1出現了3次,所以[1,1]為3,2出現了2次,所以[2,2]為2,[1,2]為3+2=5……

現在我們想要查詢區間[1,8]第6大的數,操作如下

[1,8]區間上有10個數,左孩子有8個,右孩子有2個,8>6,所以向左子樹遞迴;

[1,4]區間上有8個數,左孩子有5個,右孩子有3個,6>5,說明我們要找的數在右子樹上,所以我們只要在右子樹上找到第k-sum[i]大的數就行了,也就是6-5=1;

一直向下遞迴,直到遞迴到某個葉子結點,就說明找到第k大的數了;

權值線段樹

維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性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...

權值線段樹

權值線段樹的功能有 基於線段樹和二分的思想 即定義 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,...