求助!为什么我写的BST厌氧?

P3369 【模板】普通平衡树

@[vectorwyx](/user/238408) 因为O2已经救不了BST了。。。一开始MLE可能是递归层数过多爆栈。。
by 枫初音斗颂皮 @ 2020-02-09 09:36:18


@[枫初音斗颂皮](/user/107880) 但是,为什么我的同学用BST只T了一个点呢?
by vectorwyx @ 2020-02-09 09:40:38


@[vectorwyx](/user/238408) 显然这几个点是专门卡BST的,再吸氧也没法过。 这边表示如果用bfs的方式的话不吸氧也能不MLE
by yummy @ 2020-02-09 09:40:49


@[vectorwyx](/user/238408) 本蒟蒻的平衡二叉树可以AC,但我加了很多神奇的算法优化
by judgejudge @ 2020-02-09 09:41:01


@[yummy](/user/101694) 但是我的代码和我的同学的代码思路是一样的啊,这是我同学的代码: ```cpp #include<cstdio> #include<algorithm> #define N 100010 using namespace std; struct Node{ int l,r; int data; int siz,cnt; }t[N]; int n,cnt,root; void pushup(int rt){ int l=t[rt].l; int r=t[rt].r; t[rt].siz=t[l].siz+t[r].siz+t[rt].cnt; } void insert(int &rt,int x){ if(rt==0){ rt=++cnt; t[rt].data=x; t[rt].cnt=t[rt].siz=1; return; } // rebuild(rt); if(t[rt].data==x){ t[rt].cnt++; t[rt].siz++; return; } if(t[rt].data>x){ insert(t[rt].l,x); pushup(rt); return; } if(t[rt].data<x){ insert(t[rt].r,x); pushup(rt); return; } } int delmin(int &rt){ if(t[rt].l){ int ret=delmin(t[rt].l); pushup(rt); return ret; } int ret=rt; rt=t[rt].r; return ret; } void del(int &rt,int x){ if(t[rt].data>x){ del(t[rt].l,x); pushup(rt); } if(t[rt].data<x){ del(t[rt].r,x); pushup(rt); } if(t[rt].data==x){ if(t[rt].cnt>1){ t[rt].cnt--; t[rt].siz--; return; } if(t[rt].l==0){ rt=t[rt].r; return; } if(t[rt].r==0){ rt=t[rt].l; return; } int tmp=delmin(t[rt].r); t[rt].data=t[tmp].data; t[rt].cnt=t[tmp].cnt; pushup(rt); return; } } int getk(int rt,int x){ if(t[rt].data==x) return t[t[rt].l].siz+1; if(t[rt].data<x) return (t[rt].siz-t[t[rt].r].siz)+getk(t[rt].r,x); if(t[rt].data>x) return getk(t[rt].l,x); } int getkth(int rt,int x){ if(t[t[rt].l].siz+1<=x&&x<=t[t[rt].l].siz+t[rt].cnt) return t[rt].data; if(t[t[rt].l].siz+1>x) return getkth(t[rt].l,x); if(x>t[t[rt].l].siz+t[rt].cnt) return getkth(t[rt].r,x-(t[t[rt].l].siz+t[rt].cnt)); } int getpre(int rt,int x){ int p=rt,ans; while(p){ if(x<=t[p].data){ p=t[p].l; }else{ ans=p; p=t[p].r; } } return ans; } int getsuc(int rt,int x){ int p=rt,ans; while(p){ if(x>=t[p].data){ p=t[p].r; }else{ ans=p; p=t[p].l; } } return ans; } int main(){ scanf("%d",&n); while(n--){ int opt,x; scanf("%d%d",&opt,&x); if(opt==1){ insert(root,x); } if(opt==2){ del(root,x); } if(opt==3){ printf("%d\n",getk(root,x)); } if(opt==4){ printf("%d\n",getkth(root,x)); } if(opt==5){ printf("%d\n",t[getpre(root,x)].data); } if(opt==6){ printf("%d\n",t[getsuc(root,x)].data); } } return 0; } ``` 然后我用他的代码提交[只T了最后一个点](https://www.luogu.com.cn/record/30324120)
by vectorwyx @ 2020-02-09 09:45:01


@[judgejudge](/user/133986) (平衡二叉树是什么树)
by 白鲟 @ 2020-02-09 09:45:25


@[白鲟](/user/67952) 说白了就是区间二分
by judgejudge @ 2020-02-09 09:47:22


@[白鲟](/user/67952) 只是趋于一种平衡稳定的结构罢了
by judgejudge @ 2020-02-09 09:47:47


$QAQ$关于$BST$ ~~[关于平衡树](https://www.luogu.com.cn/discuss/show/137272)~~
by UnyieldingTrilobite @ 2020-02-09 09:53:41


@[return20071007](/user/250637) 禁止玩梗
by 诱宵美⑨ @ 2020-02-09 10:08:48


| 下一页