可能是因为二分的细节问题。
我的超时代码二分部分是这样的:
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=−4,计算得到mid=(−9)/2=−4,如果temp.second≤k也是成立的,那么会发现l和r的值不会变化,于是就会无法跳出二分从而超时。
一种解决办法是改成
int mid=(l+r)>>1;
改了之后就过了,因为/2和>>操作有差别。
右移是商向负无穷取,除是商向0取。