權值線段樹套序列線段樹

2022-05-30 17:42:10 字數 2066 閱讀 2329

p3380 【模板】二逼平衡樹(樹套樹)

主要思路如下:

外層為權值線段樹,內層為動態開點線段樹,也就是每個權值線段樹上的節點開乙個動態開點線段樹。

外層的權值線段樹支援查詢排名,內層的線段樹限制了區間。實際上就是在普通權值線段樹上查詢的價值變成了在其線段樹上區間查詢返回的值。

對於這道模板題,我們先寫幾個函式:

插入下方的update為外層線段樹,將路徑上的所有點的線段樹修改。

上方的update為內層線段樹,動態開點單點修改。

要判斷k==1為題目需要,因為如果是刪除的話就不需要開點了。

變數解釋:v為權值,p為下標,k為修改的值。

void update(int &ro,int l,int r,int p,int k)

void update(int &ro,int l,int r,int v,int p,int k)

查詢

本題有多個查詢:

查詢k在區間中的排名,我們需要查詢0~k-1在區間中的個數將結果加1。(因為有可能有重複元素)

查詢區間內排名為k的值,我們只需要在權值線段樹上查詢即可,乙個點的貢獻就是其線段樹在區間內的貢獻。

查詢前驅和後繼,就是將上面兩種操作合併,先查詢有多少點在區間內小於/小於等於該值,然後查詢排名即可。

注意判斷邊界情況。

int query(int ro,int l,int r,int x,int y)

int rank(int ro,int l,int r,int x,int y,int l,int r)

int kth(int ro,int l,int r,int k,int l,int r)

inline int pre(int x,int y,int k)

inline int nxt(int x,int y,int k)

**
#include#include#include#include#include#includeusing namespace std;

inline int read()

namespace star

void update(int &ro,int l,int r,int v,int p,int k)

int query(int ro,int l,int r,int x,int y)

int rank(int ro,int l,int r,int x,int y,int l,int r)

int kth(int ro,int l,int r,int k,int l,int r)

inline int pre(int x,int y,int k)

inline int nxt(int x,int y,int k)

inline void work()

} }}signed main()

p3332 [zjoi2013]k大數查詢

只剩乙個詢問查詢k大數,區間修改。具體就是把上面內層的線段樹變成了區間修改的。

常數巨大的**

#include#include#include#include#include#include#define int long long

using namespace std;

inline int read()

namespace star

void pushup(int ro)

void update(int &ro,int l,int r,int x,int y,int k)

void update(int &ro,int l,int r,int v,int x,int y,int k)

int query(int ro,int l,int r,int x,int y)

int kth(int ro,int l,int r,int k,int l,int r)

inline void work()

} }}signed main()

bzoj 2141 線段樹套權值線段樹

首先交換的兩個數兩邊的數產生的逆序對數不變。那麼只需要考慮中間的數和兩個數本身。只考慮第乙個數大於第二個數的情況 小於的情況是這個的逆過程 首先答案 1 這兩個數產生的逆序對 答案 位置在兩個數之間並且值也在兩個數之間的數的個數 2 答案 位置在兩個數之間並且值與兩個數中的乙個相等的數的個數 可以用...

權值線段樹

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