P3369 模板 普通平衡樹

2021-09-26 21:25:30 字數 1456 閱讀 1236

題目描述

您需要寫一種資料結構(可參考題目標題),來維護一些數,其中需要提供以下操作:

1、插入x數

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

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

4、查詢排名為x的數

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

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

輸入格式

第一行為nn,表示操作的個數,下面nn行每行有兩個數optopt和xx,optopt表示操作的序號( 1 \leq opt \leq 6 1≤opt≤6 )

輸出格式

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

輸入輸出樣例

輸入 #1

101 106465

4 11 317721

1 460929

1 644985

1 84185

1 89851

6 81968

1 492737

5 493598

輸出 #1

106465

84185

492737

#includeusing namespace std;

#define maxn 1000010

typedef long long ll;

int sz,rt,f[maxn],cnt[maxn],ch[maxn][2],siz[maxn],key[maxn];

void clear(int x)

bool get(int x)

void pushup(int x)

}void rotate(int x)

void splay(int x)

rt=x;

}void insert(int x)

int now=rt,fa=0;

while(1)

fa=now; now=ch[now][key[now]key[fa]]=sz; //根據加入點的順序重新標號

f[sz]=fa; key[sz]=x;

pushup(fa); splay(sz); return;}}

} int rnk(int x)//有多個相同的數

if(!ch[rt][0] && !ch[rt][1])

if(!ch[rt][0])

else if(!ch[rt][1])

int oldrt=rt,leftbig=pre();

splay(leftbig);

ch[rt][1]=ch[oldrt][1];

f[ch[oldrt][1]]=rt;

clear(oldrt); pushup(rt);

}int main()

else

} return 0;

}

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 ...

P3369 模板 普通平衡樹

1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的數 6.求x的後繼 後繼定義為大於x,且最小的數 輸入格式 第一行為n,表示操作的個...