如题,在输入以下数据时:
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
*/