2023.5.28

一道树状数组的蓝调了很久,死因是访问下标 \(0\) 导致死循环。

如果循环变量 \(i\) 出现了 \(0\) ,那么 \(i\) 将会+=lowbit(i)-=lowbit(i)。而 \(\operatorname{lowbit}(0)=0\&0=0\) ,会导致 \(i\) 一直等于 \(0\) 而造成死循环。

如何避免死循环?

  • 边界要写对。sum 函数一定要记得循环条件写成 i>=1,而不是写成i>=0

  • 写之前注意看数据范围是否有 \(0\) 。如果有 \(0\) ,每次访问函数时传入的参数都要 \(+1\) 。例如如果 \(a\) 的数据范围是 \(1\le a \le100\) ,访问时应该把 add(a,1);sum(a); 改成 add(a+1,1);sum(a+1);

  • 如果检查过前面两个都没有问题,但还是死循环的话,很有可能是调用函数时使用的变量因在前面写错了某些东西导致它变为 \(0\) 。所以这时应该回到前面去检查一下是否写错了什么东西。

posted @ 2024-07-24 11:28  MinimumSpanningTree  阅读(19)  评论(0)    收藏  举报