如果将二分偏移量写成减的形式。
int l = -110, r = 110, mid, ans;
while(l <= r) {
mid = l + r >> 1;
for(int i = 1; i <= m; i++)
if(edge[i].col) edge[i].dis -= mid;
kruskal();
if(cnt < k)
l = mid + 1, ans = res + k * mid;
else
r = mid - 1;
for(int i = 1; i <= m; i++)
if(edge[i].col) edge[i].dis += mid;
}
就会35pts
但如果改成加的写法, 就直接AC了, 如下。
int l = -110, r = 110, mid, ans;
while(l <= r) {
mid = l + r >> 1;
for(int i = 1; i <= m; i++)
if(edge[i].col) edge[i].dis += mid;
kruskal();
if(cnt >= k)
l = mid + 1, ans = res - k * mid;
else
r = mid - 1;
for(int i = 1; i <= m; i++)
if(edge[i].col) edge[i].dis -= mid;
}
AClink
求问原因(