警钟撅烂
  • 板块P3863 序列
  • 楼主longlinyu7
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/5 16:23
  • 上次更新2024/11/5 19:39:02
查看原帖
警钟撅烂
1054181
longlinyu7楼主2024/11/5 16:23

如果你 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;
}
2024/11/5 16:23
加载中...