權值線段樹

2022-06-13 12:06:08 字數 978 閱讀 9627

我們一般的線段樹的節點下標是陣列,而我們只要把它變成值,就能統計每個節點的數量了。  

類似於桶的實現吧。  

其實這個的線段樹就是字首和,也可以用樹狀陣列來代替。  

至於查詢k大,只要二分就可以了。  

資料範圍大的時候通常先離散化資料,所以算半個離線資料結構。  

拿洛谷的平衡樹模板為例。

這裡由於懶得寫線段樹就拿樹狀陣列代替了。  

如果開心的話手動改成線段樹就可以了。  

1 #include 2

using

namespace

std;

3const

int n=1e6+1000;4

intread()

10int order[n],act[n][2

],cnt,t[n],n;

11bool cmp(int a,int b)

12int fd(int

a)20

return -1;21

}22void add(int x,int val)

23int query(int

x)28

void insert(int x)

29void del(int x)

30int getrank(int x)

31int getnum(int

rk)41

return -1;42

}43int getpre(int x)

44int getnxt(int x)

4546

intmain()

4754 sort(order+1,order+1+cnt,cmp);

55 cnt=unique(order+1,order+1+cnt)-order;

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

65return0;

66 }

view code

權值線段樹

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