MLE。。。

P3369 【模板】普通平衡树

超级MLE代码如下:~~(惨不忍睹)~~ ```cpp #include<bits/stdc++.h> using namespace std; int cnt,root; struct node{ int data,left,right,sum,s; }tree[100010]; int newnode(int e){ tree[++cnt]=node{e,0,0,1,1}; return cnt; } int maintain(int &x){ tree[x].s=tree[tree[x].left].s+tree[tree[x].right].s+1; } void insert(int &x,int e){ if(x==0){ x=newnode(e); return; } if(e==tree[x].data) tree[x].sum++; else insert((e>tree[x].data?tree[x].right:tree[x].left),e); maintain(x); } int find(int x,int e){ if(x==0) return 0; if(e==tree[x].data) return x; return find((e>tree[x].data?tree[x].right:tree[x].left),e); } int findmax(int x){ return tree[x].right==0?x:findmax(tree[x].right); } int findmin(int x){ return tree[x].left==0?x:findmin(tree[x].left); } void del(int &x,int e){ if(tree[x].data==e){ if(tree[x].sum>1) tree[x].sum--; else{ if(tree[x].left==0&&tree[x].right==0) x=0; else if(tree[x].left&&tree[x].right==0) x=tree[x].left; else if(tree[x].left==0&&tree[x].right) x=tree[x].right; else{ int d=tree[x].left; while(tree[tree[d].right].right){ tree[d].s--; d=tree[d].right; } tree[d].s--; tree[tree[d].right].s--; tree[x].data=tree[tree[d].right].data; tree[d].right=tree[tree[d].right].left; } } } else if(e>tree[x].data) del(tree[x].right,e); else del(tree[x].left,e); tree[x].s--; } int kth(int x,int k){ int s=tree[tree[x].left].s; if(k>=s+1&&k<=s+tree[x].sum) return tree[x].data; return k<=s?kth(tree[x].left,k):kth(tree[x].right,k-s-tree[x].sum); } int Rank(int x,int e){ e=find(x,e); return tree[tree[e].left].s+1; } int findl(int x,int e){ if(x==0) return 0; if(e==tree[x].data) return 0; if(e<tree[x].data) return findl(tree[x].left,e); int t=findl(tree[x].right,e); return t?t:x; } int lowerbound(int x,int k){ int d=findl(x,k); return tree[d].data?tree[d].data:tree[tree[d].left].data; } int findu(int x,int e){ if(x==0) return 0; if(e==tree[x].data) return 0; if(e>tree[x].data) return findu(tree[x].right,e); int t=findu(tree[x].left,e); return t?t:x; } int upperbound(int x,int k){ int d=findu(x,k); return tree[d].data?tree[d].data:tree[tree[d].right].data; } int main(){ int n; tree[0]=node{0,0,0,0,0}; scanf("%d",&n); for(int i=1;i<=n;i++){ int p,x; scanf("%d%d",&p,&x); if(p==1) insert(root,x); if(p==2) del(root,x); if(p==3) printf("%d\n",Rank(root,x)); if(p==4) printf("%d\n",kth(root,x)); if(p==5) printf("%d\n",lowerbound(root,x)); if(p==6) printf("%d\n",upperbound(root,x)); } return 0; } ```
by 北海_Beihai @ 2018-02-05 21:54:25


|