P3369 模板 普通平衡樹

2022-05-16 01:08:54 字數 2004 閱讀 7688

1.插入x數

2.刪除x數(若有多個相同的數,因只刪除乙個)

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

4.查詢排名為x的數

5.求x的前驅(前驅定義為小於x,且最大的數)

6.求x的後繼(後繼定義為大於x,且最小的數)

輸入格式:

第一行為n,表示操作的個數,下面n行每行有兩個數opt和x,opt表示操作的序號(1≤opt≤6)

輸出格式:

對於操作3,4,5,6每行輸出乙個數,表示對應答案

輸入樣例#1:

10

1 106465

4 11 317721

1 460929

1 644985

1 84185

1 89851

6 81968

1 492737

5 493598

輸出樣例#1:

106465

84185

492737

時空限制:1000ms,128m

1.n的資料範圍: n≤100000

2.每個數的資料範圍:[-107,107]

ch[n][2]:二維陣列,ch[x][0]代表 x的左兒子,ch[x][1]代表 x的右兒子。

val[n]:一維陣列,val[x]代表x儲存的值。

cnt[n]:一維陣列,cnt[x]代表x儲存的重複權值的個數。

par[n]:一維陣列,par[x]代表x的父節點。

size[n]:一維陣列,size[x]代表x子樹下的儲存的權值數(包括重複權值)。

splay使用旋轉保持平衡。所以旋轉是最重要的操作,也是最核心的操作。

將乙個節點一路rotate到指定節點的兒子。

將最大的小於等於x的數所在的節點splay到根。

#include#define inf 0x3f3f3f3f

using

namespace

std;

const

int maxn=100000+100

;int ch[maxn][2

],fa[maxn],val[maxn],size[maxn],cnt[maxn];

introot,ncnt;

inline

intread()

while(ch>='

0'&&ch<='9')

return x*f;

}inline

int chk(int

u)inline

void pushup(int

u)inline

void rotate(int

u)inline

void splay(int u,int goal=0

) rotate(u);

}if(!goal)root=u;

}inline

void insert(int

x) splay(u);

}inline

void find(int

x)inline

int kth(intk)}

inline

int succ(int

x)inline

int pre(int

x)void remove(int

x)int

main()

return0;

}

view code

P3369 模板 普通平衡樹

題目描述 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1 插入x數 2 刪除x數 若有多個相同的數,因只刪除乙個 3 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 4 查詢排名為x的數 5 求x的前驅 前驅定義為小於x,且最大的...

P3369 模板 普通平衡樹

aimee 考試前看到某份考綱提到了平衡樹 突發奇想想學乙個 但是來不及了,為了平衡學習時間,以及大佬的建議下,毅然決定用vector搞乙個 額,要是vector都過不了,那以我的水平,也拿不到更多的分了 配方,lower bound upper bound vector 對於操作1,使用vecto...

P3369 模板 普通平衡樹

這道題最簡單的解法 權值線段樹。下面的程式為了方便大家理解沒有離散化哦。操作 i ii 插入 刪除 x 數procedure change l,r,k,key,add longint var mid longint begin inc tree k add if l r then exit mid ...