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:1 106465
4 11 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
106465時空限制:1000ms,128m84185
492737
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 0x3f3f3f3fview codeusing
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;
}
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 ...