bzoj 3224 普通平衡樹 (Splay)

2021-08-21 20:04:51 字數 1402 閱讀 4845

題目

思路:splay模板題

**:

#includeusing namespace std;

#define maxn 1000000

//f[i]表示i的父結點,ch[i][0]表示i的左兒子,ch[i][1]表示i的右兒子,

//key[i]表示i的關鍵字(即結點i代表的那個數字),cnt[i]表示i結點的關鍵字出現的次數(相當於權值),

//size[i]表示包括i的這個子樹的大小;sz為整棵樹的大小,root為整棵樹的根。

int ch[maxn][2],f[maxn],size[maxn],cnt[maxn],key[maxn];

int sz,root;

//將當前點的各項值都清0(用於刪除之後)

void clear(int x)

//判斷當前點是它父結點的左兒子還是右兒子

bool get(int x)

//更新當前點的size值(用於發生修改之後)

void update(int x)

}void rotate(int x)

void splay(int x)

void insert(int v)

int now=root,fa=0;

while(1)

fa=now;

now=ch[now][key[now]if(now==0)

}}//查詢x的排名

int find(int v)

else

ans+=cnt[now];

now=ch[now][1];}}

}//找到排名為x的點

int findx(int x)

else

}}int pre()

return now;

}int next()

void del(int x)

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

if(!ch[root][0])

else

if(!ch[root][1])

int leftc=pre(),oldroot=root;

splay(leftc);

f[ch[oldroot][1]]=root;

ch[root][1]=ch[oldroot][1];

clear(oldroot);

update(root);

return;

}int main()

else

if(opt==2)

else

if(opt==3)

else

if(opt==4)

else

if(opt==5)

else

}return

0;}

bzoj3224普通平衡樹

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

BZOJ3224 普通平衡樹

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

BZOJ3224 普通平衡樹

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