題目描述
插入 xx 數
刪除 xx 數(若有多個相同的數,因只刪除乙個)
查詢 xx 數的排名(排名定義為比當前數小的數的個數 +1+1 。若有多個相同的數,因輸出最小的排名)
查詢排名為 xx 的數
求 xx 的前驅(前驅定義為小於 xx ,且最大的數)
求 xx 的後繼(後繼定義為大於 xx ,且最小的數)
輸入輸出格式
輸入格式:
第一行為 nn ,表示操作的個數,下面 nn 行每行有兩個數 optopt 和 xx , optopt 表示操作的序號( 1 \leq opt \leq 6 1≤opt≤6 )
輸出格式:
對於操作 3,4,5,63,4,5,6 每行輸出乙個數,表示對應答案
輸入輸出樣例
輸入樣例#1: 複製
10 1 106465
4 1
1 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 100000 n≤100000
2.每個數的資料範圍: [-^7, ^7][−10
7 ,10 7 ]
#include#include#includeusing namespace std;
const
int maxn = 100005;
const
int inf = 0x7f7f7f7f;
struct nodenode[maxn];
int n,cnt,points;
inline void update(int x)
inline bool jud(int x)
inline void connect(int x,int f,int son)
inline void rotate(int x)
inline void splay(int at,int
to) else
}}inline int crepoint(int x,int f)
inline void destroy(int x)
inline int find(int v)
int nxt=vnow].v?0:1;
if(!node[now].ch[nxt]) return 0;
now=node[now].ch[nxt];
} }inline int build(int x)
else
int nxt=xnow].v?0:1;
if(!node[now].ch[nxt])
now=node[now].ch[nxt];}}
return 0;
}inline void push(int x)
inline void pop(int v)
if(!node[deal].ch[0])
else
destroy(deal);
}int rank(int x)
}if(now) splay(now,node[0].ch[1]);
return 0;
}int atrank(int x)
}splay(now,node[0].ch[1]);
return node[now].v;
}inline int lower(int x)
return res;
}inline int upper(int x)
return res;
}int main()
return 0;
}
洛谷 3369 模板 普通平衡樹
題目描述 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 插入x數 刪除x數 若有多個相同的數,因只刪除乙個 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於xx,且最大的數 求x的後繼 後...
洛谷P3369 模板 普通平衡樹
本蒟蒻最近剛剛學會平衡樹,特來寫篇部落格以加深印象。我的意思是若寫的不好望各位奆佬多多包含!插入 x 數 刪除 x 數 若有多個相同的數,因只刪除乙個 查詢 x 數的排名 排名定義為比當前數小的數的個數 1 若有多個相同的數,因輸出最小的排名 查詢排名為 x 的數 求 x 的前驅 前驅定義為小於 x...
洛谷P3369 模板 普通平衡樹
插入x數 刪除x數 若有多個相同的數,因只刪除乙個 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數 求x的後繼 後繼定義為大於x,且最小的數 輸入格式 第一行為n,表示操作的個數,下面n行每行有兩個數...