如果你 WA 0pts。并且是手打二分,且发现输出有负数。请检查一下二分里面的 ans 有没有赋初始值,如果这个块里面没有对应的数,又没有赋初始值的话,会出现不可控的后果。
一下是我的错误代码。
int find(int x,int val){
int l=st[x],r=ed[x],mid,ans;
while(l<=r){
mid=(l+r)>>1;
if(b[mid]>=val){ //? 应该用排序后的数组
r=mid-1;
ans=mid;
}
else l=mid+1;
}
return ed[x]-ans+1;
}
正确的应该是:
int find(int x,int val){
//!可能会找不到,一定要给ans赋初始值。
int l=st[x],r=ed[x],mid,ans=ed[x]+1; //? 初始化边界有问题
while(l<=r){
mid=(l+r)>>1;
if(b[mid]>=val){ //? 应该用排序后的数组
r=mid-1;
ans=mid;
}
else l=mid+1;
}
return ed[x]-ans+1;
}