我們一般的線段樹的節點下標是陣列,而我們只要把它變成值,就能統計每個節點的數量了。
類似於桶的實現吧。
其實這個的線段樹就是字首和,也可以用樹狀陣列來代替。
至於查詢k大,只要二分就可以了。
資料範圍大的時候通常先離散化資料,所以算半個離線資料結構。
拿洛谷的平衡樹模板為例。
這裡由於懶得寫線段樹就拿樹狀陣列代替了。
如果開心的話手動改成線段樹就可以了。
1 #include 2view codeusing
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 }
權值線段樹
維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性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 ...