模板 二逼平衡樹

2022-05-08 19:33:10 字數 1832 閱讀 1725

試題分析

乙個十分裸的樹套樹板子(這也是乙個板子),線段樹中套平衡樹($treap$)

主要就有乙個不是平凡操作的,就是處理第$2$個操作時,因為其他操作確保每次複雜度在$o(log^2 n)$,而$2$操作無法快速在$treap$中找到,所以就可以去二分乙個值,用$1$操作判斷即可,單次操作時間複雜度$o(log^3 n)$。並且在$treap$中查詢的排名$x$是小於$x$的最大排名,這樣才能保證最後只算一次$x$

#include#include

#include

#include

#include

using

namespace

std;

inline

intread()

while(c>='

0'&&c<='9')

return f*ans;

}const

int n=500001

;int tot,root[n<<4

];int

n,m,val[n];

struct

nodetr[n

<<4

];struct

treap

void zag(int &k)

void zig(int &k)

void insert(int x,int &k)

tr[k].size++;

if(x==tr[k].num)

if(x

else

return

; }

void del(int x,int &k)

if(tr[k].l*tr[k].r==0)

if(tr[tr[k].l].rnk

else

return

; }

tr[k].size--;

if(x

else

del(x,tr[k].r);

return

; }

int qrnk(int x,int

k)

int qpre(int x,int

k)

int qnex(int x,int

k)}treap;

struct

segment_tree

void change(int k,int l,int r,int x,int y,int

w)

int qrnk(int k,int l,int r,int x,int y,int

val)

int qpre(int k,int l,int r,int x,int y,int

w)

int qnex(int k,int l,int r,int x,int y,int

w)

int qkth(int le,int ri,int

kth)

else r=mid-1

; }

return

maxn;

}}segment;

intmain()

if(opt==2

)

if(opt==3

)

if(opt==4

)

if(opt==5

) }

return0;

}view code

二逼平衡樹

第一層就是區間線段樹,第二層用fhq treap來維護。注意的是,askrank函式應減1因為這是在一坨區間裡的某一區間,要求的應是比自己小的數。思路很簡單,所以 就是用來給大家器官移植的。pragma gcc optimize 2 include include include const int...

二逼平衡樹

link 原題就叫這名字,雖然我並沒有看出來它二逼在 就是乙個線段樹套平衡樹的模板,挺好理解也挺好寫,除了手抖收穫了一片re之外一切都挺順利的,開了 o 2 隨便過 逃 include include include define zczc using namespace std const int...

二逼平衡樹(樹套樹)

傳送門 這道題的做法 我學的是最經典的線段樹套平衡樹。因為發現其實這題的題目描述和普通平衡樹非常的相似 只是這次是在給定的區間中。所以我們能想象到用線段樹維護區間,然後每個線段樹的節點都是一顆平衡樹,用於維護區間內資訊。以上操作除了操作2需要二分答案,複雜度是 o log 3n 剩下的都是 o lo...