大概算是个警示后人帖?
一年前即 2021 年的 11 月 19 日,我刚开始学算法没多久,当时的我仍然对未来充满着幻想,希望能在 2022 年进入省队,参加 NOI。然后我发现了这道题。当时的我刚做完 P3482 所以独立做出了这道题然后写了一下,获得了28 分的好成寄。我不知道为什么。然后我就放弃了这个题。
一年后,我正在为自己人生中最后一场 OI 赛事 NOIP2022 做准备。我(在题库筛选紫题第一页)又一次发现了这道题,这一次我决定搞明白之前为什么错了。
经过了一些调试之后,我发现了错误原因:我用一个 long long 类型的数代替了 vis 数组,由于这题 vis 数组只要开到 60,所以这没有问题。但是我找环的时候是这么写的:
while (!(vis & (1 << x))) {vis |= 1 << x; v[z]++; x = perm[x];}
可以看到 1 << x 会是 int 类型,然后爆了。改成 1ll << x 之后就过了……
警钟敲烂。