悬赏两个永久的关注
平衡树求前驱的时候,这样写应该是求<=的数
int get_prev(int p,int key){
if(!p) return -inf;
else if(tr[p].key>key) return get_prev(tr[p].l,key);//这里改成>=就是求小于的
return max(tr[p].key,get_prev(tr[p].r,key));
}
这一段代码是暴力删掉所有<m的数(这是正确的)
int get_prev(int p,int key){
if(!p) return -inf;
else if(tr[p].key>key) return get_prev(tr[p].l,key);
return max(tr[p].key,get_prev(tr[p].r,key));
}
此处省略114行……
ll t=m-1,t1;
while((t1=get_prev(rt,t))!=-inf){
t=t1;//将t赋值为他的前驱(可以等于,有重复的话还是值还是一样)
del(rt,t1);//删除前驱
num--;//这是记录还剩多少个节点(也就是公司里还有的员工)
}
但如果这么写,感觉上没有问题,但是就是出问题了,下载第一组数据num的值不对
int get_prev(int p,int key){
if(!p) return -inf;
else if(tr[p].key>=key) return get_prev(tr[p].l,key);
return max(tr[p].key,get_prev(tr[p].r,key));
}
ll t=m,t1;
while(get_prev(rt,t)!=-inf){
t1=t;t=get_prev(rt,t+1);
del(rt,get_prev(rt,t1+1));
num--;
}