hack
查看原帖
hack
470769
DengStar楼主2022/5/30 12:34
12 2
1 1 1 1 2 3 4 5 6 7 8 9
1 4 6 1
2 1 12

这个数据可以 hack 掉这个用分块写的AC提交(下称“AC提交1”,下文中的“AC提交2”是正确的代码),详细见下:
AC提交1对于上面的数据输出54,而AC提交2对于上面的数据输出51
AC提交1change函数中的最后几行是错误的:

if(book[L]!=book[R])
	for(int i=(book[R]-1)*bsize+1;i<=R;i++) a[i]+=c;
sum[book[R]]+=(R-((book[R]-1)*bsize+1)+1)*c;

sum[book[R]]+=(R-((book[R]-1)*bsize+1)+1)*c;这个语句写在了if的外面,实际上它应该写在if的里面,即像AC提交2里写的这样:

if(book[L]!=book[R])
{
	for(int i=(book[R]-1)*bsize+1;i<=R;i++) a[i]+=c;
	sum[book[R]]+=(R-((book[R]-1)*bsize+1)+1)*c;
}

这个错误会导致当book[L]==book[R]时,sum数组的值会错误的改变。这个错误的改变会在下一次用到了sum数组的值的查询(根据分块的原理,当LR中隔了一个完整的块时,ans会直接加上这个块的sum值,如果这个sum的值是错误的,ans也会变成错误的)中体现。
在这个 hack 数据中,1 4 6 1对应的就是book[L]==book[R]的情况,这时候sum[2]的值错误的多加上了3,这个错误在2 1 12这个询问中体现了出来。这也就是为什么对于这个数据,AC提交1AC提交2多输出3的原因。 希望把这个 hack 数据加入评测数据。

2022/5/30 12:34
加载中...