二逼平衡樹(樹套樹)

2022-05-05 17:30:11 字數 2288 閱讀 9253

傳送門

這道題的做法……我學的是最經典的線段樹套平衡樹。

因為發現其實這題的題目描述和普通平衡樹非常的相似……只是這次是在給定的區間中。所以我們能想象到用線段樹維護區間,然後每個線段樹的節點都是一顆平衡樹,用於維護區間內資訊。

以上操作除了操作2需要二分答案,複雜度是\(o(log^3n)\),剩下的都是\(o(log^2n)\)的。

然後這個具體的實現方法很複雜……其實平衡樹內部和線段樹內部的操作和普通的方法基本都是大同小異的。不同的在於插入,刪除節點以及新建節點。具體的思路其實和平衡樹也很像……不過轉移到線段樹上比較複雜,但是看看**都能看懂。

注意這題要垃圾**。還有就是樹套樹真的好長……還挺容易寫錯的……這玩意也是咋寫都要5k+……

#include#include#include#include#include#include#define rep(i,a,n) for(register int i = a;i <= n;i++)

#define per(i,n,a) for(register int i = n;i >= a;i--)

#define enter putchar('\n')

#define pr pair#define mp make_pair

#define fi first

#define sc second

#define i inline

#define get(x) (t[t[x].fa].ch[1] == (x))

using namespace std;

typedef long long ll;

const int m = 1000005;

const int n = 10000005;

const int inf = 2147483647;

int read()

while(ch >='0' && ch <= '9') ans = ans * 10 + ch - '0',ch = getchar();

return ans * op;

}struct tree

t[m];

int n,m,a[m],root[m],idx,bin[m],btop,op,l,r,x,y,z;

i int newnode(int x)

i void update(int u)

i void rotate(int x)

i void splay(int x)

update(x);

}i int getnum(int k,int x)

return v;

}i int getkth(int k,int x)

return 0;

}i int getless(int k,int x)

return cur;

}i int getmax(int u)

i int getmin(int u)

i int getpre(int k,int x)

i int getnext(int k,int x)

i void insert(int k,int x)

u = newnode(x);

if(!root[k])

int v = root[k],w = 0,dir = 0;

while(v)

if(dir) t[w].ch[0] = u;

else t[w].ch[1] = u;

t[u].fa = w,splay(u),root[k] = u;

}i void del(int k,int x)

if(t[u].size == 1) root[k] = 0;

else if(!t[u].ch[0] || !t[u].ch[1])

else

bin[++btop] = u;

}void segbuild(int p,int l,int r)

void segchange(int p,int l,int r,int k,int val)

int segless(int p,int l,int r,int kl,int kr,int val)

int segpre(int p,int l,int r,int kl,int kr,int val)

int segnext(int p,int l,int r,int kl,int kr,int val)

int segkth(int kl,int kr,int k)

return l;

}int main()

return 0;

}

二逼平衡樹 樹套樹(線段樹套Splay平衡樹)

題面 bzoj3196 解析線段樹和splay兩棵樹套在一起,常數直逼inf,但最終僥倖過了 思路還是比較簡單,在原陣列維護乙個下標線段樹,再在每乙個線段樹節點,維護乙個對應區間的權值splay。簡單說一下操作 0.提取區間 1.查詢區間內k的排名 提取區間,找到區間內所有的splay,分別比k小的...

BZOJ 3196 二逼平衡樹 樹套樹

description 您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 1.查詢k在區間內的排名 2.查詢區間內排名為k的值 3.修改某一位值上的數值 4.查詢k在區間內的前驅 前驅定義為小於x,且最大的數 5.查詢k在區間內的後繼 後繼定義為大於x,且最小的數 in...

BZOJ3196二逼平衡樹 樹套樹

description 您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 1.查詢k在區間內的排名 2.查詢區間內排名為k的值 3.修改某一位值上的數值 4.查詢k在區間內的前驅 前驅定義為小於x,且最大的數 5.查詢k在區間內的後繼 後繼定義為大於x,且最小的數 in...