P3369 模板 普通平衡樹 Treap

2022-04-06 17:38:02 字數 2751 閱讀 2653

插入x數

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

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

查詢排名為x的數

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

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

輸入格式:

第一行為n,表示操作的個數,下面n行每行有兩個數opt和x,opt表示操作的序號( 1 \leq opt \leq 61≤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 \leq 100000n≤100000

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

在此鳴謝

treap 真是個好東西。。

1 #include2 #include3 #include4

using

namespace

std;56

const

int n = 200010;7

8struct

datat[n];

11int

root,tn,ans;

1213 inline char

nc()

17 inline int

read()

2526 inline void pushup(int

x) 29 inline void leftturn(int &k)

37 inline void rightturn(int &k)

45void insert(int &k,int

x) 52 t[k].siz++;

53if (t[k].val==x) t[k].cnt ++;

54else

if (x >t[k].val)

58else62}

63void delete(int &k,int

x) 69

if (t[k].l * t[k].r == 0) k = t[k].l +t[k].r;

70else

if (t[t[k].l].key

73else76}

77else

if (x >t[k].val)

80else83}

84int getk(int k,int

x) 91

int getkth(int k,int

x) 98

void getpre(int k,int

x) 103

void getsuc(int k,int

x) 108

109int

main()

120return0;

121 }

更新後的treap

1 #include2 #include3 #include4

5using

namespace

std;67

#define lson t[k].l

8#define rson t[k].r

9const

int n = 200010;10

11struct

datat[n];

14int

root,tn,ans;

1516 inline char

nc()

20 inline int

read()

2829 inline void pushup(int

k) 32 inline void leftturn(int &k)

40 inline void rightturn(int &k)

48void insert(int &k,int

x) 55 t[k].siz++;

56if (t[k].val==x) t[k].cnt ++;

57else

if (x >t[k].val)

61else65}

66void delete(int &k,int

x) 72

if (lson * rson == 0) k = lson +rson;

73else

if (t[lson].key

76else79}

80else

if (x >t[k].val)

83else86}

87int getk(int k,int

x) 94

int getkth(int k,int

x) 101

void getpre(int k,int

x) 106

void getsuc(int k,int

x) 111

112int

main()

123return0;

124 }

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