平衡树模板 Treap 20pts RE 删除模块 求助
查看原帖
平衡树模板 Treap 20pts RE 删除模块 求助
125018
ztasd楼主2021/8/14 10:20

评测记录

如题,在输入以下数据时:

9
1 1
1 1
1 4
1 5
1 1
1 4
2 1
2 1
2 1

我的程序会在输入最后一行后崩溃,经过测试是删除模块的问题,代码如下:

struct treap{//大根堆 
    treap* ls,*rs;
    int r,val;
    int size,cnt;
    treap();
};
void remove(treap *&p,int x){
    if(p==nul){
        return;
    }else if(p->val==x){
        if(p->cnt>=2){
            p->cnt--;
            push_up(p);
        }else{
            if(p->ls!=nul||p->rs!=nul){
                if(p->rs==nul||(p->ls->r)>(p->rs->r)){
                    zig(p);
                    remove(p->rs,x);
                }else{
                    zag(p);
                    remove(p->ls,x);
                }
                push_up(p);
            }else{
                delete p;
                p=nul;
            }
        }
    }else if(x<p->val){
        remove(p->ls,x);
    }else{
        remove(p->rs,x);
    }
    push_up(p);
}

并且发现在删除这两行代码

delete p;
p=nul;

后程序在本机能正常工作,然而交上去仍然是RE

实在找不到错误了,有大佬能帮忙看一下代码吗

完整Code:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3fffffff
struct treap{//大根堆 
    treap* ls,*rs;
    int r,val;
    int size,cnt;
    treap();
};
treap *nul=new treap;
treap::treap(){
    ls=rs=nul;
    r=rand();
    val=0;
    size=cnt=0;
}
void push_up(treap* p){
    p->size=p->ls->size+p->rs->size+p->cnt;
}
void zig(treap* &p){//右旋 
    treap *k=p->ls;p->ls=k->rs;k->rs=p;p=k;
    push_up(p->rs);push_up(p);
}
void zag(treap* &p){//左旋 
    treap *k=p->rs;p->rs=k->ls;k->ls=p;p=k;
    push_up(p->ls);push_up(p);
}
void insert(treap* &p,int x){
    if(p==nul){
        p=new treap;
        p->val=x;
        p->cnt=p->size=1;
    }else if(x==p->val){
        p->cnt++;
    }else if(x<p->val){
        insert(p->ls,x);
        if(p->ls->r>p->r){
            zig(p);
        }
    }else if(x>p->val){
        insert(p->rs,x);
        if(p->rs->r>p->r){
            zag(p);
        }
    }
    push_up(p);
}
void remove(treap *&p,int x){
    if(p==nul){
        return;
    }else if(p->val==x){
        if(p->cnt>=2){
            p->cnt--;
            push_up(p);
        }else{
            if(p->ls!=nul||p->rs!=nul){
                if(p->rs==nul||(p->ls->r)>(p->rs->r)){
                    zig(p);
                    remove(p->rs,x);
                }else{
                    zag(p);
                    remove(p->ls,x);
                }
                push_up(p);
            }else{
                delete p;
                p=nul;
            }
        }
    }else if(x<p->val){
        remove(p->ls,x);
    }else{
        remove(p->rs,x);
    }
    push_up(p);
}
int rank(treap* &p,int x){
    if(p==nul){
        return 1;
    }else if(p->val==x){
        return p->ls->size+1;
    }else if(x<p->val){
        return rank(p->ls,x);
    }else if(x>p->val){
        return rank(p->rs,x)+p->ls->size+p->cnt;
    }
}
int kth(treap* &p,int x){
    if(p==nul){
        return INF;
    }else if(p->ls->size>=x){
        return kth(p->ls,x);
    }else if(p->ls->size+p->cnt>=x){
        return p->val;
    }else{
        return kth(p->rs,x-p->ls->size-p->cnt);
    }
}
int count(treap* &p,int x){
    if(p==nul){
        return 0;
    }else if(x<p->val){
        return count(p->ls,x);
    }else if(x==p->val){
        return p->cnt;
    }else if(x>p->val){
        return count(p->rs,x);
    }
}
int main(){
    srand(time(NULL));
    int n;
    scanf("%d",&n);
    treap* tree=nul;
    while(n--){
        int op,x;
        scanf("%d%d",&op,&x);
        if(op==1){
            insert(tree,x);
        }else if(op==2){
            remove(tree,x);
        }else if(op==3){
            printf("%d\n",rank(tree,x));
        }else if(op==4){
            printf("%d\n",kth(tree,x));
        }else if(op==5){
            printf("%d\n",kth(tree,rank(tree,x)-1));
        }else if(op==6){
            printf("%d\n",kth(tree,rank(tree,x)+count(tree,x)));
        }
    }
    return 0;
}
/*1145141919810*/
//0 1 1 1 1 1 1 4 4 5 8 9 9
/*
9
1 1
1 1
1 4
1 5
1 1
1 4
2 1
2 1
2 1
*/
/*20
1 964673
5 968705
4 1
3 964673
5 965257
1 915269
1 53283
3 964673
3 53283
3 53283
1 162641
5 973984
1 948119
2 915269
2 53283
6 959161
1 531821
1 967521
2 531821
1 343410
*/
2021/8/14 10:20
加载中...