樹套樹 學習筆記

2022-04-10 05:42:30 字數 2424 閱讀 8584

樹套樹像他的名字一樣,就是一棵樹套另一棵樹。用一棵外層樹來維護一些區間之類的東西。然後外層樹的每個節點都是一棵內層樹。就這樣

bzoj3196

這是一道線段樹套平衡樹的模板題。外層用一棵線段樹來維護區間操作。然後線段樹的每個節點都是一棵平衡樹

操作1:查詢從l到r中比k小的數的個數,然後+1輸出即可

操作2:二分一下答案,找排名小於等於k的最大值就行了

操作3:將原來的值先刪去,然後加入新的值.

操作4:查詢每個子區間中的前驅,然後最大的那個就是當前區間中的前驅

操作5:與操作4類似,查詢每個子區間中的後繼,然後最小的那個就是當前區間中的後繼。

ps:在進行操作3的時候不要忘記將原來陣列中的值也進行更改,不然以後再刪除的時候會出錯。在這個地方調了2h 2333

/*

* @author: wxyww

* @date: 2018-12-11 08:29:48

* @last modified time: 2018-12-11 10:44:01

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

typedef long long ll;

#define ls tr[cur].ch[0]

#define rs tr[cur].ch[1]

const int n = 100000 + 100,inf = 2147483647;

ll read()

while(c>='0'&&c<='9')

return x*f;

}namespace treap tr[n * 20];

void up(int cur)

int tot = 0;

void rotate(int &cur,int f)

void insert(int &cur,int val)

tr[cur].siz++;

if(val == tr[cur].val)

int d = val > tr[cur].val;

insert(tr[cur].ch[d],val);

if(tr[tr[cur].ch[d]].id < tr[cur].id) rotate(cur,d);

}void del(int &cur,int val)

if(!ls || !rs)

rotate(cur,tr[rs].id < tr[ls].id);

del(cur,val);

return;

}tr[cur].siz--;

del(tr[cur].ch[val > tr[cur].val],val);

}int rank(int cur,int val)

return ans;

}int pred(int cur,int val)

int nex(int cur,int val)

}using namespace treap;

int tree[n << 2];

int a[n];

int n;

void build(int rt,int l,int r)

int mid = (l + r) >> 1;

for(int i = l;i <= r;++i) insert(tree[rt],a[i]);

build(rt << 1,l,mid);

build(rt << 1 | 1,mid + 1,r);

}void delet(int rt,int l,int r,int pos,int c)

insert(tree[rt],c);

del(tree[rt],a[pos]);

int mid = (l + r) >> 1;

if(pos <= mid) delet(rt << 1,l,mid,pos,c);

else delet(rt << 1 | 1,mid + 1,r,pos,c);

}int getrank(int rt,int l,int r,int l,int r,int val)

int getpred(int rt,int l,int r,int l,int r,int val)

int getnex(int rt,int l,int r,int l,int r,int val)

int max = -inf;

int getkth(int l,int r,int x)

return ans;

}int main()

if(opt == 2)

if(opt == 3)

if(opt == 4)

if(opt == 5)

}return 0;

}

樹套樹學習筆記

題目 傳送門 這是第一類入門級的樹套樹,線段樹 樹狀陣列套平衡樹。用線段樹或樹狀陣列維護區間,再用平衡樹維護對區間中的動態修改。相對於普通的直白操作會好一些,但會帶好幾個log 有人可能會疑惑為什麼為每個區間開一棵平衡樹不會mle呢?我們以線段樹為例,每一層的線段樹的節點數都為n,至多有logn層。...

模板 樹套樹

xsy2685 lg3380 bzoj3196 tyvj1730 二逼平衡樹 1.查詢k在區間內的排名 乙個數的排名是小於這個數的個數 1 2.查詢區間內排名為 k 的值 3.修改某一位值上的數值 4.查詢 k 在區間內的前驅 前驅定義為小於 x 且最大的數 5.查詢 k 在區間內的後繼 後繼定義為...

樹套樹專題

對資料結構的不熟練 題目鏈結 嘗試一下樹狀陣列套主席樹的寫法。小細節沒有重視 為了方便起見,一般我們寫getrank x 求的都是 1 include2 const int maxn 50035 3 const int maxnode 5000035 4 const int inf 21474836...