看到题解几乎都是把边权先加了 mid ,跑完 check() 再减去 mid 。我的疑惑是,能不能采用这样一种处理方式:提前在排序时考虑 mid 的影响,并于 cmp() 函数内按加上 mid 后的值排序,这样,也能找到此时的最佳方案,而边权实际上不改变, ans 加上的就是原本的边权,直接输出 ans 即可。代码参考如下:
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);
}
mid=l-1;
check();
printf("%d",ans+(need-pos)*mid);
看到讨论区里有人也问了近似的问题,但最后却归结到了直线型数据对WQS二分的影响这个老问题上。没回答出这个做法到底可不可行,如果不可行,又是错在哪里?
期望dalao们的解答!