警示后人,不是l>r的问题
查看原帖
警示后人,不是l>r的问题
373938
wowwowwow楼主2024/11/24 21:10

在分块做法中,如果这样写:

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]);。因为在最后转为整型时会向下取整,当aiai不是完全平方数时减数带有小数点,会使得最后赋的值小1。可以代几个数理解一下:

	int a = 9 - sqrt(7), b = 9 - (int)sqrt(7);
	printf("%d %d", a, b);

输出为6 7

就是这个错误让我找接近1h
2024/11/24 21:10
加载中...