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