如果你有一些TLE
查看原帖
如果你有一些TLE
868672
undefina楼主2024/1/6 23:26

可能是因为二分的细节问题。

我的超时代码二分部分是这样的:

int l=-30005,r=30005;
while(l<r){
	int mid=(l+r)/2;
	pll temp=solve(mid);
	if(temp.second<=k) r=mid,ans=temp.first-k*mid;
	else l=mid+1;
}

这份代码可以被卡爆,例如某时候l=−5,r=−4l=-5,r=-4,计算得到mid=(−9)/2=−4mid=(-9)/2=-4,如果temp.second≤ktemp.second\le k也是成立的,那么会发现ll和rr的值不会变化,于是就会无法跳出二分从而超时。

一种解决办法是改成

int mid=(l+r)>>1;

改了之后就过了,因为/2/2和>>>>操作有差别。 右移是商向负无穷取,除是商向0取。

2024/1/6 23:26
加载中...