權值線段樹

2021-08-23 12:00:03 字數 1359 閱讀 7575

維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。

使用二分的思想(離散化的時候,需要用到)

支援查詢全域性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,...