題目描述
您需要寫一種資料結構(可參考題目標題),來維護一些數,其中需要提供以下操作:
1、插入x數
2、刪除x數(若有多個相同的數,因只刪除乙個)
3、查詢x數的排名(排名定義為比當前數小的數的個數+1。若有多個相同的數,因輸出最小的排名)
4、查詢排名為x的數
5、求x的前驅(前驅定義為小於x,且最大的數)
6、求x的後繼(後繼定義為大於x,且最小的數)
輸入格式
第一行為nn,表示操作的個數,下面nn行每行有兩個數optopt和xx,optopt表示操作的序號( 1 \leq opt \leq 6 1≤opt≤6 )
輸出格式
對於操作3,4,5,6每行輸出乙個數,表示對應答案
輸入輸出樣例
輸入 #1
101 106465
4 11 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
輸出 #1
106465
84185
492737
#includeusing namespace std;
#define maxn 1000010
typedef long long ll;
int sz,rt,f[maxn],cnt[maxn],ch[maxn][2],siz[maxn],key[maxn];
void clear(int x)
bool get(int x)
void pushup(int x)
}void rotate(int x)
void splay(int x)
rt=x;
}void insert(int x)
int now=rt,fa=0;
while(1)
fa=now; now=ch[now][key[now]key[fa]]=sz; //根據加入點的順序重新標號
f[sz]=fa; key[sz]=x;
pushup(fa); splay(sz); return;}}
} int rnk(int x)//有多個相同的數
if(!ch[rt][0] && !ch[rt][1])
if(!ch[rt][0])
else if(!ch[rt][1])
int oldrt=rt,leftbig=pre();
splay(leftbig);
ch[rt][1]=ch[oldrt][1];
f[ch[oldrt][1]]=rt;
clear(oldrt); pushup(rt);
}int main()
else
} return 0;
}
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 ...
P3369 模板 普通平衡樹
1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的數 6.求x的後繼 後繼定義為大於x,且最小的數 輸入格式 第一行為n,表示操作的個...