題目鏈結
模板只是有幾個容易出錯的地方
第45行容易忘記
第54行裡面的cnt--和siz--容易忘記
第56行是根據id判斷不是val
第60行siz--容易忘記
第64行是siz+1不是siz+cnt
第77行和82行等於的情況容易忽略
#include#include#include#include#define ls tr[cur].ch[0]
#define rs tr[cur].ch[1]
using namespace std;
typedef long long ll;
const int n = 100000 + 100,inf = 1e7 + 100;
ll read()
while(c >= '0' && c <= '9')
return x * f;
}struct node tr[n];
void up(int cur)
void rotate(int &cur,int f)
int tot;
void insert(int &cur,int val)
tr[cur].siz++;//!!
if(tr[cur].val == val)
int d = val > tr[cur].val;
insert(tr[cur].ch[d],val);
if(tr[tr[cur].ch[d]].id < tr[cur].id) rotate(cur,d);
}void del(int &cur,int val)
if(!ls || !rs)
int d = tr[rs].id < tr[ls].id;
rotate(cur,d);
del(cur,val);
}else tr[cur].siz--,del(tr[cur].ch[val > tr[cur].val],val);
}int rank(int cur,int val)
int kth(int cur,int now)
}int pred(int cur,int val)
int nex(int cur,int val)
int main()
return 0;
}
記憶或會消失,但我的心會記著承諾。 Luogu 3369 普通平衡樹
插入x數 刪除x數 若有多個相同的數,因只刪除乙個 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數 求x的後繼 後繼定義為大於x,且最小的數 輸入格式 第一行為n,表示操作的個數,下面n行每行有兩個數...
普通平衡樹 lg3369
在多次學習splay後,我終於理解並碼出了整份 參考了的部落格 includeusing namespace std define inf 0x3f3f3f3f define ls st p ch 0 define rs st p ch 1 inline intread while ch 0 ch ...
洛谷 3369 模板 普通平衡樹
題目描述 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 插入x數 刪除x數 若有多個相同的數,因只刪除乙個 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於xx,且最大的數 求x的後繼 後...