CF1787D
这里有个很典的 trick。我们将 \(i+a_i\) 向 \(i\) 连边,那么只要一个 \(<0\) 或 \(>n\) 的点能够走到 \(i\),就说明 \(i\) 能在有限的次数内出去。这玩意跑个拓扑排序即可。那么现在我们可以考虑从 \(1\) 开始走,因为只能修改一个点的值,记 \(u\) 为 \(1\) 走若干步后到达的点。那么 \(u\) 可以修改成的值有:\(x [u+x \le 0 \lor u+x > n \lor (f_{u+x} \land c_{u,u+x})]\)。其中 \(f_x\) 表示 \(x\) 是否可以在有限的次数内走出去。\(c_{i,j}\) 表示 \(j\) 是否不依赖 \(i\)。也就是说 \(j\) 不会走到 \(i\)(不会形成环)。那么再跑个拓扑就行了。同时,如果 \(1\) 能够在最开始走出去,那么 \(1\) 在这个过程中没有经过过的点是无论怎么改都不影响 \(1\) 的,这些点的贡献都是 \(2n+1\)。时间复杂度 \(O(n)\)。
CF1787E
乱猜。考虑将这 \(n\) 个数尽量分成多的段,使得每段的异或和均为 \(x\)。那么我们将每两个异或和为 \(x\) 的数分成一组。如果剩下的数异或出来不为 \(0\),那么无解。我也不知道为啥。然后就做完了,再将多的合并。时间复杂度 \(O(n)\)。