关于此题WQS二分的一点疑惑
查看原帖
关于此题WQS二分的一点疑惑
372708
Yahbim楼主2021/7/14 21:41

看到题解几乎都是把边权先加了 midmid ,跑完 check()check() 再减去 midmid 。我的疑惑是,能不能采用这样一种处理方式:提前在排序时考虑 midmid 的影响,并于 cmp()cmp() 函数内按加上 midmid 后的值排序,这样,也能找到此时的最佳方案,而边权实际上不改变, ansans 加上的就是原本的边权,直接输出 ansans 即可。代码参考如下:

bool cmp(edger x,edger y){
    int tx=x.w,ty=y.w;
    if(!x.c) tx+=mid;
    if(!y.c) ty+=mid;
    //如果边颜色为白色,边权的副本增加
    if(tx==ty) return x.c<y.c;//尽量多选白边
    return tx<ty;
}
    while(l<r){
    mid=(l+r)>>1;   
    check();
    if(pos>need) l=mid+1;
    else if(pos<need) r=mid;
    else
        printf("%d",ans),exit(0);
    }
    //如果循环后没有找到值为need的切点pos,说明这是直线型数据
    mid=l-1;
    check();
    printf("%d",ans+(need-pos)*mid);
    //因为先前保证了尽量多选白边,所以切点pos一定在最左边,先-pos*mid找到WQS意义下的最小值,再加回need*mid,从而处理ans

看到讨论区里有人也问了近似的问题,但最后却归结到了直线型数据对WQS二分的影响这个老问题上。没回答出这个做法到底可不可行,如果不可行,又是错在哪里?

期望dalao们的解答!

2021/7/14 21:41
加载中...