fhq treap 28pts 求调

P3369 【模板】普通平衡树

@[yonghu_3913](/user/820574) `tree[y].l = merge(x,tree[y].l);`
by carrotpp @ 2024-01-07 08:50:30


@[carrotpp](/user/729455) 参数写反了吗?
by yonghu_3913 @ 2024-01-07 09:04:26


[.](https://www.luogu.com.cn/record/142161719)
by yonghu_3913 @ 2024-01-07 09:13:35


@[yonghu_3913](/user/820574) 你原来代码的 merge 和delet 都有写错捏 ``` #include<bits/stdc++.h> using namespace std; const int N = 1e5+10; struct fhqtreap{ int data; int pos; int size;//子树大小 int l,r; }tree[N]; int tot; int root = 0; void pushup(int x){ tree[x].size = tree[tree[x].l].size + tree[tree[x].r].size + 1; } int add(int x){ tree[++tot] = {x,rand(),1,0,0}; return tot; } void split(int u,int &a,int &b,int val){ if(!u){ a = b = 0; return; } if(tree[u].data <= val){ a = u; split(tree[a].r,tree[a].r,b,val); }else{ b = u; split(tree[b].l,a,tree[b].l,val); } pushup(u); } void split_siz(int u,int &a,int &b,int siz){ if(!u){ a = b = 0; return; } if(tree[tree[u].l].size + 1 <= siz){ a = u; split_siz(tree[a].r,tree[a].r,b,siz - 1 - tree[tree[u].l].size); }else{ b = u; split_siz(tree[b].l,a,tree[b].l,siz); } pushup(u); } int merge(int x,int y){ if(!x || !y){ return x + y; } if(tree[x].pos < tree[y].pos){ tree[x].r = merge(tree[x].r,y); pushup(x); return x; }else{ tree[y].l = merge(x,tree[y].l); pushup(y); return y; } } void insert(int x){ int l,r; split(root,l,r,x); root = merge(merge(l,add(x)),r); } void delet(int x){ int l,r; int xa,ya; split(root,l,r,x); split_siz(l,xa,ya,tree[l].size - 1); root = merge(xa,r); } int pos(int x){ int l,r; split(root,l,r,x - 1); int t = tree[l].size + 1; root = merge(l,r); return t; } int k(int x,int y){ int p = tree[tree[x].l].size + 1; if(p == y){ return tree[x].data; } if(p < y){ return k(tree[x].r,y - p); } return k(tree[x].l,y); } int p(int x){ int l,r; split(root,l,r,x - 1); int t = k(l,tree[l].size); root = merge(l,r); return t; } int nxt(int x){ int l,r; split(root,l,r,x); int t = k(r,1); root = merge(l,r); return t; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr),cout.tie(nullptr); int n; cin >> n; for(int i = 1;i <= n;i++){ int op; int x; cin >> op >> x; if(op == 1){ insert(x); }else if(op == 2){ delet(x); }else if(op == 3){ cout << pos(x) << endl; }else if(op == 4){ cout <<k(root,x) << endl; }else if(op == 5){ cout << p(x) << endl; }else{ cout << nxt(x) << endl; } } } ```
by carrotpp @ 2024-01-07 09:26:27


@[carrotpp](/user/729455) 过了,谢谢
by yonghu_3913 @ 2024-01-07 09:45:25


|