一个一个问题(不调代码)
查看原帖
一个一个问题(不调代码)
315205
Kniqht楼主2023/10/2 11:12

悬赏两个永久的关注

平衡树求前驱的时候,这样写应该是求<=的数

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--;
}
2023/10/2 11:12
加载中...