以下使用 0 到 N−1 的下标,并把所有下标按模 N 解释。
在同一个起点执行两次操作会互相抵消。因此只需令 xi∈{0,1} 表示是否在位置 i 开始的操作被执行奇数次。
为了让位置 i 最终变成 0,必须满足
ai=j=i−K+1⨁i
将相邻两个位置的方程异或,得到
xi⊕xi−K=
令 d=gcd(N,K)、m=N/d、h=K/。映射 会把所有下标分成恰好 个长度为 的环。
对余数类 r 定义
Pr=i≡r(modd)⨁
把一个环中的所有差分方程异或,结果为 Pr⊕Pr−1。因此差分方程有解当且仅当
P0=P1=⋯=P
把一个环按
vt=r+tK(modN),
的顺序排列。选取 canonical 解
xv0=0,x
记环 r 中 x=1 的个数为 cr。
只考虑差分方程时,每个环都有一个自由变量 yr,表示是否把整个环的 x 全部翻转。yr=0 的代价是 , 的代价是 。因此只满足差分方程的最小代价为
B=r∑min(cr,m−
差分方程只使用了原方程之间的差,所以还需要额外满足一个原方程。对位置 0 定义残量
E=a0⊕j=−K+1⨁
目标是 E=0。
长度为 K 的区间中,每个余数类恰好出现 h=K/d 次。
若 h 为偶数,翻转整个环不会改变 E。因此 E=1 时无解,E=0 时答案为 B。
若 h 为奇数,每个 yr 都会把 E 翻转一次,所以必须满足
y0⊕y1⊕⋯⊕y
对每个环,按代价较小的一侧定义
zr=[cr>m/2],
若 Z=E,答案就是 B。否则必须让某一个环选择另一侧,额外代价为
rmin∣m−2cr∣.
处理查询时,翻转 ap 只会翻转 Δp、Δ 和 。因此只要维护 的余数类数量,就能在 时间判断所有 是否相等。
在一个环内,若翻转 Δvs 且 s≥1,canonical 解中的
xvs,xv
这一段 suffix 会全部翻转。当 s=0 时,Δv0 只用于环的闭合一致性条件,不会改变 canonical 解本身。
把所有环按环内顺序拼接成一个长度为 N 的数组,使用支持区间翻转和区间 1 个数查询的 lazy segment tree。每个查询最多进行两次 suffix 翻转,并重新计算至多两个受影响环的 cr。
每当某个 cr 改变时,同时维护:
- B=∑rmin(cr,m−c
E 也不需要每次重新计算。预处理 impact[u],表示翻转 Δu 时被翻转的 canonical suffix 与 E 使用的长度 区间相交位置数的奇偶性。环的起点满足 。对位置 的查询,
E⊕=[p=0]⊕impact[p]⊕impac
因此每个查询的答案为:
- 若所有 Pr 不相等,输出
-1;
- 若 h 为偶数,E=1 时输出
-1,否则输出 B;
- 若 为奇数,答案为 。
每个测试用例的预处理时间为 O(NlogN),每个查询为 O(logN)。总时间复杂度为 O((N+Q,空间复杂度为 。
Solution written by GPT5.6