維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。
使用二分的思想(離散化的時候,需要用到)
支援查詢全域性k小值,全域性rank,前驅,後繼等。
單詞操作時間複雜度為o(logn)
空間複雜度為o(n)
相對於平衡樹的優勢:**簡單,速度快
劣勢:值域較大時,我們需要離散化,變成離線資料結構(我認為的離線指的是不能更改插入之類的操作,只能進行查詢)
求解逆序對的個數(樹狀陣列,歸併排序等等方法)
#include
#include
#include
using namespace std;
const
int maxn=5005;
struct node
data[4*maxn];
void build(int
id,int l,int r)
int query(int
id,int l,int r)
void update(int
id,int x)
int mid=(data[id].l+data[id].r)/2;
if(mid>=x)
update(id*2,x);
else
update(id*2+1,x);
data[id].num=data[id*2].num+data[id*2+1].num;
return ;
}int a[maxn];
int main()
int sum=ans;
for(int i=n-1;i>=0;i--)
cout
0;}
總而言之,權值線段樹就是指每個節點存的是這個點出現的次數。
比如對於1,3,4,5,5,6;
畫出一棵樹
最底下的節點數從1到n,有n個,如果為0的節點數太多,我們需要離散化,因為壓根沒有用到,不需要。
其次根節點的權值等同於序列中該值出現的次數。
權值線段樹感覺考的東西比較少,介紹這個主要是為了介紹主席樹(可持久化線段樹),為了理解主席樹。
#include
#include
#include
using
namespace
std;
int a[100],b[100],c[100],n;
int solve()//離散化
int main()
權值線段樹**實現 權值線段樹
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 ...
權值線段樹
權值線段樹的功能有 基於線段樹和二分的思想 即定義 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,...