可持久化平衡樹(FHQ Treap)
兩個最基本的操作 merge合併 split分割
merge
把兩棵treap合併成一棵treap,要滿足T1最大值要比T2最小值小,比較將隨機數值key值更大的作為合併後的根
假設T1作為根節點作為新子樹的根,左子樹不變,右子樹對T1原來的右子樹與T2再遞迴一次merge
spilt
把一棵treap p 砍成兩棵treap,p1 k個點,p2 n-k個點,且要滿足p1最大值要比p2最小值小,即將p中前k小的分給p1
若k<=size[p.l] pl,pr=spilt(p.l,k) p2=pr+p.l
若k>size[p.l]
插入節點:
設插入節點pt,key值為v
詢問有多少個數小於等於v,設為k
pl,pr=spilt(p,k)
merge(merge(pl,pt),pr)
刪點:
排名第k
pl,pr=spilt(p,k)
px,pt=spilt(pl,k-1)
merge(px,pr)
l-r 區間翻轉
p1,p2=spilt(p,r)
p3,p4=spilt(p1,l-1)
p4 (l,r)
fhq treap 大多數情況下可替換 splay
lct 中的 splay 無法被 fhq treap 替換
相關推薦
可持久化平衡樹(FHQ Treap)
兩個最基本的操作 merge合併 split分割 merge 把兩棵treap合併成一棵treap,要滿足T1最大值要比T2最小值小,比較將隨機數值key值更大的作為合併後的根 假設T1作為根節點作為新子樹的根,左子樹不變,右子樹對T1原來的右子樹與T2再遞迴一次merge spilt
Luogu3835 【模板】可持久化平衡樹(fhq-treap)
fhq-treap,也即非旋treap,可以在不進行旋轉操作的前提下維護treap。由於不需要旋轉,可以對其可持久化。 fhq-treap的基本操作是merge和split,並且通過這兩個操作實現對treap的各項維護。 merge用來合併兩棵treap,且要求滿足其中一棵treap中的最小值
Luogu5055 【模板】可持久化文藝平衡樹(fhq-treap)
注意下傳標記時也需要新建節點。空間開的儘量大。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #inclu
Luogu P3391 【模板】文藝平衡樹(FHQ-Treap)
題意 給出一個長為$n$序列$[1,2,...,n]$,$m$次操作,每次指定一段區間$[l,r]$,將這段區間翻轉,求最終序列 題解 雖然標題是$Splay$,但是我要用$FHQ\ Treap$,考慮先將$[l,r]$這段區間$split$出來($k$即為這段區間) void split(int o
洛谷P3391 【模板】文藝平衡樹(Splay)(FHQ Treap)
and fine 背景 clas bad 例如 spa 個數 static 題目背景 這是一道經典的Splay模板題——文藝平衡樹。 題目描述 您需要寫一種數據結構(可參考題目標題),來維護一個有序數列,其中需要提供以下操作:翻轉一個區間,例如
2018牛客網暑期ACM多校訓練營(第三場)C Shuffle Cards(可持久化平衡樹/splay)
car 訓練營 shu cas queue math getchar() %d fir 題意 牌面初始是1到n,進行m次洗牌,每次抽取一段放到最前面。求最後的序列。 分析 神操作!!!比賽時很絕望,splay技能尚未點亮,不知道怎麽用。 殊不知,C++庫裏有rope
Rope大法(可持久化平衡樹)
2008年OI集訓論文上有介紹<對塊狀連結串列的一點研究>,其主要是結合了連結串列和陣列各自的優點,連結串列中的節點指向每個資料 塊,即陣列,並且記錄資料的個數,然後分塊查詢和插入。在g+
可持久化線段樹(主席樹)模板
spa std nod d+ sin 整理 ostream pan int 比賽時候寫的,這裏整理到這裏 #include <iostream> #include <cstdio> #include <cstring> using
可持久化線段樹(主席樹)
AS string can -a 過程 思想 oot and amp 關於可持久化線段樹 可持久化線段樹可以將歷史版本的線段樹記憶下來,並支持新建版本與查詢歷史版本。 其中有一道經典的靜態主席樹的題就是求區間k大。 建樹的過程其實就是先建一棵空樹,再按輸入順序插入節點。需要
可持久化線段樹(cf1080F)
大佬部落格 https://www.cnblogs.com/zinthos/p/3899565.html 題目:https://codeforces.com/problemset/problem/1080/F 題目大意: 給你k個線段,每個線段屬於一個集合(
可持久化線段樹(主席樹)快速簡潔教程 圖文並茂 保證學會。kth number例題
如果學不會也不要打我。 假設你會線段樹 開始! --- 主席樹也叫可持久化線段樹 顧名思義,它能夠儲存線段樹在每個時刻的版本。 什麼叫每個時刻的版本?你可能對一棵普通線段樹進行各種修改,這每種樣子就是我們所說的不同時刻的版本。 假設我們對線段樹進行單點修改,維護區間和。 每次修改操作中,只有logn個節點會被
[可持久化線段樹(主席樹)]
要求 als 長度 span else -s d+ 左右 教室 主席樹 拋出問題 如題,給定N個整數構成的序列,將對於指定的閉區間查詢其區間內的第K小值。 輸入輸出格式 輸入格式: 第一行包含兩個正整數N、M,分別表示序列的長度和查詢的個數。 第二行
3224: Tyvj 1728 普通平衡樹(新板子)
pri ati urn 多個 stdin 目標 一個 題目 page 3224: Tyvj 1728 普通平衡樹 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 17048 Solved: 7429[Submit][S
[luogu3835]可持久化平衡樹
pair 操作 .... 普通 倒數 i++ class 又是 style 就是把普通平衡樹的代碼可持久化一下 第一發90,最後兩個點MLE???這是什麽操作 後來把能非遞歸的都改成非遞歸,結果TLE???這又是什麽操作 最後發現我才用了內存限制的一半,改大一點之後過
洛谷 P3835 【模板】可持久化平衡樹
正常 發生 using 我沒 持久化 pro 現在 class 小數 這個題也是可以用可持久化線段樹來解決的。 值域線段樹(也有的叫權值線段樹)可以用來維護一個可重集,並實現一些一般情況下平衡樹才能實現的事情。 如果用值來當做區間左右端點,每個葉子節點上存某個值出現的次數,
可持久化平衡樹
() truct cas int 需要 name else root val 可持久化普通平衡樹 題意 如題。 解法 大家都知道,用權值線段樹可以過普通平衡樹那道題,那麽對於可持久化普通平衡樹,我們是否也可以用主席樹來搞一搞呢。答案是肯定的。只需要動態開點就行了。其他的跟普
Luogu P3835 【模板】可持久化平衡樹
P3835 【模板】可持久化平衡樹 題意 題目背景 本題為題目普通平衡樹的可持久化加強版。 題目描述 您需要寫一種資料結構(可參考題目標題),來維護一些數,其中需要提供以下操作(對於各個以往的歷史版本): 插入\(x\)數 刪除\(x\)數(若有多個相同的數,因只刪除一個,如果沒有請忽略
題解 P3835 【【模板】可持久化平衡樹】
就是可持久化後的普通平衡樹嘛(逃 題目描述不寫了(懶了 這裡是題目 主要思路:FHQ Treap + 可持久化 普通FHQ Treap加上一點可持久化的東西如下:(打上註釋的程式碼是可持久化的特殊操作) inline int merge(int x, int y) { if(!x || !y
【LG3835】可持久化平衡樹
【LG3835】可持久化平衡樹 題面 洛谷 解法一 參考文章 rope大法好 \(rope\)基本操作: #include<ext/rope> using namespace __gnu_cxx;//rope的名稱空間 rope<type> R; R.push_back(a)
P3369 【模板】普通平衡樹(容器做法)
題目描述 您需要寫一種資料結構(可參考題目標題),來維護一些數,其中需要提供以下操作: 插入xx數 刪除xx數(若有多個相同的數,因只刪除一個) 查詢xx數的排名(排名定義為比當前數小的數的個數+1+1。若有多個相同的數,因輸出最小的排名) 查詢排名為xx的數 求