解题思路
把每条记录看成关于未知整数 x1,…,xp 的线性方程:D 是差,‘S‘ 是和。问题是判断整数解是否存在,以及解空间还剩几个自由度。
- 用带权并查集维护每个变量相对所在连通块根的一次式:xu=sgn[u]⋅xr+off[u],其中 sgn 只能是 +1 或 −1。
- 一条方程总能写成 xa+ka⋅xb=w。代入一次式后,只剩下两个根(或同一个根)。
- 若两点已在同一块:系数变成 0 则检查冗余或矛盾;系数是 ±2 则试图解出根,且必须整除。根一旦被钉死,再来冲突就无解。
- 若两点分属两块:把一块的根挂到另一块,并按公式更新符号与偏移。若两边都已钉死,还要检查合并后是否一致。
- 全部方程加入后,每个还没被钉死的根就是一个自由变量,各需实测一次。孤立点也算一个根。