wqs 二分的时候,有可能出现不能恰好达到 k 的情况。此时意味者这个凸包中 k−1,k,k+1k−1,k,k+1k−1,k,k+1 三点形成了一条直线。此时取哪一侧都是对的。但是要注意,最后的答案是 sum−val∗ksum-val*ksum−val∗k 而不是 sum−val∗cntsum-val*cntsum−val∗cnt(cntcntcnt 表示 check 跑出来的结果)。否则 hack 数据会 wa 第三个点。
由此,我们产生了两种二分判定答案的方式:if(cnt<=k) 或者 if(cnt>=k)。需要注意的是,如果使用第一种判定方式,需要在归并排序时,当边权相同时将不与 s 相连的边放在前面,表示“我想尽量让答案小,其实答案有可能比 cnt 更大的”。使用第二种时则要放在后面。否则 hack 数据会 wa 后三个点。
if(cnt<=k)
if(cnt>=k)
cnt