文藝平衡樹 Fhq Treap

2021-10-05 20:44:49 字數 1732 閱讀 8253

傳送門:文藝平衡樹

首先要闡述一點,fhq treap的按大小**是支援區間操作的,而按值**是不支援區間操作的。

fhq treap的**方式:

按權值**:

根據插入點的權值,將樹按w為邊界,**為兩顆樹,一顆樹的權值大於w,一棵樹的權值小於等於w,這樣再把新節點合併進去,就可以維護樹的平衡

按大小**:

根據插入點的節點大小,將樹按big為邊界,**為兩顆樹,一顆樹的節點大小大於big,一棵樹的節點大小小於等於big,這樣再把新節點合併進去,不僅可以維護樹的平衡,還支援區間操作

為什麼按大小**會支援區間操作:

首先,新開的每乙個節點,都可以用節點數量,代表區間中的乙個端點,呢麼我們如果修改區間,呢麼我們只需要修改平衡樹中節點數量在我們要修改的區間內即可,然後合併成新的平衡樹即可,一顆平衡樹的節點對應數量是一樣的,我們只需要改變節點對應的值即可

該題思路:

利用支援區間修改的fhq treap,我們利用懶惰標記,對區間進行修改,交換當前區間的左右子樹,從而達到顛倒乙個區間

:隨機庫函式,好多版本的c++不支援,所以就自己寫乙個叭

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const

int inf =(1

<<30)

;typedef long

long ll;

const

int base =

131;

const

int maxn =

1e5+5;

//vectorvec;

//ll n, sum[maxn * 10], c[maxn * 10], a[maxn];

//vectorvec;

int su =1;

intrand()

int cnt, rt;

struct node

tr[maxn*50]

;int

newnode

(int w)

void

pushup

(int now)

void

pushdown

(int now)

}void

split

(int now,

int big,

int&x,

int&y)

}int

merge

(int x,

int y)

else

}void

reverse

(int l,

int r)

void

dfs(

int now)

intmain()

while

(m--

)dfs

(rt)

; cout<}

P3391 模板 文藝平衡樹FHQ treap

這是一道經典的splay模板題 文藝平衡樹。輸入格式 第一行為n,m n表示初始序列有n個數,這個序列依次是 1,2,cdots n 1,n 1,2,n 1,n m表示翻轉操作次數 接下來m行每行兩個數 l,r l,r 資料保證 1 leq l leq r leq n1 l r n 輸出格式 輸出一...

文藝平衡樹

和splay差不多,就是維護區間,把siz值為l 1 1與r 1 1的兩個節點,將乙個旋轉到根,另乙個旋轉到根的右兒子上,則要修改的區間就是根的右孩子的左子樹,直接打標記即可。推薦 遠航之曲dalao writer hsz wjmzbmr tourist hzwer include include ...

文藝平衡樹

前置知識 普通平衡樹。實際上,平衡樹能做到的操作不只有插入刪除,查排名查值,前驅後繼這些。如果我們把平衡樹移到區間上,我們甚至能夠支援比線段樹更強的操作 區間翻轉。這就是文藝平衡樹這道題了。首先我們來明確一下區間樹的概念。顧名思義,區間樹就是用來維護區間的。具體地,我們規定平衡樹的中序遍歷得到的數列...