针对 CF1715D 和 ARC146B 的总结与提升
在这两个位运算问题上我都很快地考虑出大致方向,但是却出现了 WA,严重拖慢了我的进度。在此分析:
对于 ARC146B,出现了一个没有判断 \(0\) 的问题,通常以下几种地方有可能出现问题:
- 树形结构的 \(n=1\) 情况
- 位运算的 \(31\) 和 \(32\) 位的时候如果有一个地方 int 没有转换过来就会出锅:
1 << dig
是不可以算 \(dig \ge 31\) 的情况的,应当写成1ll << dig
。 - 任何时候的 \(0\):
1ll << dig
,在 \(dig\) 为任何数的时候都不可能算出 \(0\),应该特判;
log2(x) + 1
在 \(x=0\) 的时候结果为 \(1\),实际上通常情况下应该为 \(0\)。
...
我们在提交问题的时候,就要考虑有没有哪些情况会出现错误,特别地一定要思考以上三种情况。其他情况因题而异。
对于 CF1715D,从大到小贪心弄清楚了,但是实现的细节没有搞得很清楚,从前到后出现了:没有先处理 \(i=j\) 的情况,搞错贪心顺序,将已经确定的数继续修改,顺序错误应该先考虑这一位是否必须是 \(1\) 再更新...等问题,特别是最后一个问题到了比赛的结束时间还是存在。
赛时改了三个问题,但是还是遗留了一个问题。这样效率很低。
怎么解决?对拍!是应该养成对拍的习惯了。对于这一题,我们可以写出暴力 \(O(a_i^n)\) 的程序进行对拍,从而针对错误的数据进行修改。
另外,xqw 大佬教我的单步调试在对拍的时候也非常有用处。
以上是对 WA
的解决方案的分析。