社区讨论

警示后人,不是l>r的问题

P4145上帝造题的七分钟 2 / 花神游历各国参与者 5已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@m3vmcn1r
此快照首次捕获于
2024/11/24 21:12
去年
此快照最后确认于
2025/11/04 13:59
4 个月前
查看原帖
在分块做法中,如果这样写:
CPP
b[L].sum -= a[i] - sqrt(a[i]);
a[i] = sqrt(a[i]);
那么你会WA后5个点。
正确写法是:
CPP
b[L].sum -= a[i];
a[i] = sqrt(a[i]);
b[L].sum += a[i];
或者:
CPP
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。可以代几个数理解一下:
CPP
	int a = 9 - sqrt(7), b = 9 - (int)sqrt(7);
	printf("%d %d", a, b);
输出为6 7
就是这个错误让我找接近1h

回复

5 条回复,欢迎继续交流。

正在加载回复...