P3835 模板 可持久化平衡樹

2022-03-04 03:07:49 字數 2382 閱讀 6148

您需要寫一種資料結構(可參考題目標題),來維護一些數,其中需要提供以下操作(對於各個以往的歷史版本):

插入x數

刪除x數(若有多個相同的數,因只刪除乙個,如果沒有請忽略該操作)

查詢x數的排名(排名定義為比當前數小的數的個數+1。若有多個相同的數,因輸出最小的排名)

查詢排名為x的數

求x的前驅(前驅定義為小於x,且最大的數,如不存在輸出-2147483647)

求x的後繼(後繼定義為大於x,且最小的數,如不存在輸出2147483647)

和原本平衡樹不同的一點是,每一次的任何操作都是基於某乙個歷史版本,同時生成乙個新的版本。(操作3, 4, 5, 6即保持原版本無變化)

每個版本的編號即為操作的序號(版本0即為初始狀態,空樹)

輸入格式:

第一行包含乙個正整數n,表示操作的總數。

接下來每行包含三個正整數,第 i行記為 vi​,opti​,xi​。

vi​表示基於的過去版本號( 0≤vi​輸出格式:

每行包含乙個正整數,依次為各個3,4,5,6操作所對應的答案

輸入樣例#1: 

10

0 1 9

1 1 3

1 1 10

2 4 2

3 3 9

3 1 2

6 4 1

6 2 9

8 6 3

4 5 8

輸出樣例#1: 

912

103

資料範圍:

對於28%的資料滿足: 1≤n≤10

對於44%的資料滿足: 1≤n≤2⋅102

對於60%的資料滿足: 1≤n≤3⋅103

對於84%的資料滿足: 1≤n≤105

對於92%的資料滿足: 1≤n≤2⋅105

對於100%的資料滿足:1≤n≤5⋅105 , −109

≤xi​≤109

經實測,正常常數的可持久化平衡樹均可通過,請各位放心

樣例說明:

共10次操作,11個版本,各版本的狀況依次是:

[9][9]

[3, 9][3,9]

[9, 10][9,10]

[3, 9][3,9]

[9, 10][9,10]

[2, 9, 10][2,9,10]

[2, 9, 10][2,9,10]

[2, 10][2,10]

[2, 10][2,10]

[3, 9][3,9]

solution:

本題可持久化平衡樹板子題(沒啥好寫的)。

我們先用無旋treap打下普通平衡樹那道板子題,那麼可持久化無非是在之前版本的狀態基礎上每次新開節點記錄新的狀態就好了。

於是只需要每次改為新建節點去merge,改為新建節點去split,記錄每個版本的樹根就好了(感覺很簡單啊)。

**:

/*

code by 520 -- 9.26

*/#include

#define il inline

#define ll long long

#define re register

#define for(i,a,b) for(re int (i)=(a);(i)<=(b);(i)++)

#define bor(i,a,b) for(re int (i)=(b);(i)>=(a);(i)--)

using

namespace

std;

const

int n=5e5+5,inf=0x7fffffff

;int

n,root[n],cnt;

struct

nodet[n*50

];int

gi()

il int newnode(int

v)il

void up(int rt)

int merge(int x,int

y)

else

}void split(int rt,int k,int &x,int &y)

if(t[rt].date<=k)

else

}void del(int &root,int

v)void ins(int &root,int

v)il

int kth(int rt,intv)}

il int id(int &root,int

v)il

int pre(int &root,int

v)il

int suc(int &root,int

v)int

main()

return0;

}

題解 P3835 模板 可持久化平衡樹

就是可持久化後的普通平衡樹嘛 逃 題目描述不寫了 懶了 這裡是題目 inline int merge int x,int y else inline void split int rt,ll k,int x,int y else 然後開個root陣列,存各個版本的根節點,然後注意下空間就好了。記得開...

洛谷P3835 模板 可持久化平衡樹

本題為題目 普通平衡樹 的可持久化加強版。資料已經經過強化 插入x數 刪除x數 若有多個相同的數,因只刪除乙個,如果沒有請忽略該操作 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數,如不存在輸出 21...

洛谷 P3835 模板 可持久化平衡樹

可持久化平衡樹 可持久化 treap 1.插入 x 2.刪除 x 3.查詢 x 的排名 4.查詢排名為 x 的數 5.求 x 的前驅 6.求 x 的後繼 每次操作都基於某一歷史版本,同時生成乙個新的版本 include include include define maxn 500010 using...