题目链接
传送门
题意
给你\(n\)堆石子,每堆有\(a_i\)堆石子,\(q\)次操作:
- 在\([L,R]\)内有多少个子区间使得\(Alice\)(先手)在\(Nim\)博弈中获胜;
- 交换\(a_{pos},a_{pos+1}\)的值。
思路
这题和cf617E差不多。
首先我们知道以下性质:
- \(Nim\)博弈只有当所有石子数异或为\(0\)才会导致先手必败;
- 在预处理前缀异或和后,交换相邻两堆石子的石子数只会影响\(pos\)处的值。
因此我们在预处理出前缀异或和后就可以用待修改莫队来解决本题,我们用\(cnt\)数组来处理出区间内\(x\)出现次数,\(sum\)表示区间内有多少个子区间异或和为\(0\),那么最后答案为\(\frac{(R-L+1)(R-L)}{2}-sum\)。
代码实现如下
#include
#include