BZOJ3224 普通平衡樹

2021-08-19 02:08:52 字數 2768 閱讀 6942

time limit: 10 sec  memory limit: 128 mb

submit: 20469  solved: 9056

[submit][status][discuss]

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

1. 插入x數

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

3. 查詢x數的排名(若有多個相同的數,因輸出最小的排名)

4. 查詢排名為x的數

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

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

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

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

101 106465

4 11 317721

1 460929

1 644985

1 84185

1 89851

6 81968

1 492737

5 493598

106465

84185

492737

1.n的資料範圍:n<=100000

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

解析:平衡樹模板題,詳細過程看**。

**:

#include #include #include #include #include #include #include using namespace std;

const int max=101001;

const int inf=0x7fffffff;

int n,m,tot,root=1;

struct treap a[max];

inline int get_int() //讀入優化

; for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';

return x*f;

}inline int new(int num) //插入

inline void update(int p) //更新

inline void build()//插入inf和-inf,避免出現找不到前驅或後繼的情況

inline void zig(int &p) //右旋

inline void zag(int &p) //左旋

inline void insert(int &p,int val) //插入

if(val==a[p].val)

if(val < a[p].val)

else

update(p);

}inline void remove(int &p,int val) //刪除

if(a[p].l || a[p].r) //不是葉子節點,向下旋

else

update(p);

}else p=0; //是葉子節點,刪除

return;

}if(val < a[p].val) remove(a[p].l,val);

else remove(a[p].r,val);

update(p);

}inline int getrankbyval(int p,int val) //查詢該數是第幾小的數

inline int getpre(int val) //尋找前驅

break;

}if(a[p].val>a[ans].val&&a[p].valval) p=a[p].l;

else p=a[p].r;

}return a[ans].val;

}inline int getnext(int val) //尋找後繼

break;

}if(a[p].valval) ans=p;

if(a[p].val>val) p=a[p].l;

else p=a[p].r;

}return a[ans].val;

}int main()

;treap tree[max];

inline int get_int()

inline void print(int x)

inline int new(int x)

inline void update(int p)

inline void zig(int &p)

inline void zag(int &p)

inline void build()

inline void insert(int &p,int x)

if(tree[p].num==x)

if(tree[p].num>x)

else

update(p);

}inline void remove(int &p,int x)

if(tree[p].l||tree[p].r)

else p=0;

return;

} if(tree[p].numx) return rank(tree[p].l,x);

}inline int val(int &p,int x)

inline int pre(int p,int x)

int main()

} 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,且最小的...