在分块做法中,如果这样写:
b[L].sum -= a[i] - sqrt(a[i]);
a[i] = sqrt(a[i]);
那么你会WA后5个点。
正确写法是:
b[L].sum -= a[i];
a[i] = sqrt(a[i]);
b[L].sum += a[i];
或者:
b[L].sum -= a[i] - (int)sqrt(a[i]);
a[i] = sqrt(a[i]);
为什么呢。
因为浮点型位数较多,因此在和整型计算时,整型会自动转为浮点型。而后面的式子相当于b[L].sum = b[L].sum - a[i] - sqrt(a[i]);。因为在最后转为整型时会向下取整,当ai不是完全平方数时减数带有小数点,会使得最后赋的值小1。可以代几个数理解一下:
int a = 9 - sqrt(7), b = 9 - (int)sqrt(7);
printf("%d %d", a, b);
输出为6 7
就是这个错误让我找接近1h