题解:P7843 「C.E.L.U-03」布尔
题意
有 \(n\) 个布尔变量和 \(m\) 条限制,设 \(s_i\) 表示第 \(i\) 个布尔变量的取值,每条限制 \((u,x,v,y)(x,y\in\{0,1\})\) 表示 \(s_u=x\Rightarrow s_v=y\) 且 \(s_v=y\Rightarrow s_u=x\)。\(q\) 次询问 \(l,r\),问第 \([l,r]\) 条限制最少可以被划分成多少段使得每一段的限制都找得到合法解,或报告无解。\(1\leq n\leq 10^5,1\leq m\leq 6\times 10^5,1\leq q\leq 10^6\)。
题解
好题。
显然无解当且仅当区间内存在形如 \(u=v\land x\neq y\) 的限制,预处理前缀和 \(s_i=\sum_{j=1}^i[u_j=v_j\land x_j\neq y_j]\),则当 \(s_r>s_{l-1}\) 时无解。
观察到给出的限制是无向限制,所以可以扩展域并查集维护。
划段可以直接贪心,即对于当前位置 \(x\),我们找到最小的使得 \([x,y]\) 不合法的 \(y\),把 \([x,y-1]\) 划作一段,再令 \(x\leftarrow y\)。暴力跳无法承受,考虑倍增优化,预处理出 \(g_{i,j}\) 表示从 \(i\) 开始跳 \(2^j\) 次跳到的位置,那么就可以做到单次询问 \(\mathcal{O}(\log{m})\)。对于边界问题,我们把第 \(m+1\) 条限制搞成一个不合法限制即可。
问题转化为求出 \(f_i\) 表示最小的 \(j\) 使得 \([i,j]\) 不合法。注意到 \(f_i\) 单调不减。
证明:反证。若存在 \(i<j\) 且 \(f_i>f_j\),说明 \([j,f_j]\) 不合法,那么 \([i,f_j]\) 也不合法,这和 \(f_i\) 最小的定义矛盾。证毕。
于是套路地考虑决策单调性二分,也即整体二分:\(\operatorname{solve}(l,r,L,R)\) 表示 \(\forall i\in[l,r],f_i\in[L,R]\),令 \(mid=\left\lfloor\frac{l+r}{2}\right\rfloor\),我们求出 \(f_{mid}\) 后递归下去。我们从 \(mid\) 开始暴力加边,若 \(u\) 和 \(\lnot u\) 连通则无解。当然,这样暴力加边时间复杂度是错的,那么我们再次套路地考虑用可撤销并查集回滚。可以发现,如果在 \(\operatorname{solve}\) 之前保证 \([r+1,L-1]\) 中的限制都被加入,我们就可以做到只增不删。具体来说,我们先依次加入 \([mid,\min(r,L-1)]\) 中的边,再依次加入 \([\max(mid,L),R]\) 中的边,加到不合法为止时记录答案。然后我们按需撤销并查集即可。一些题解继承了 \([r+1,L-1]\) 是否合法,这是不必要的,因为整体二分保证了答案不出现在这当中。
时间复杂度 \(\mathcal{O}(n\log{n}\log{m}+(m+q)\log{m})\)。
代码
放一下整体二分部分的代码。
void solve(int l, int r, int L, int R) {
if (l > r) return;
if (L == R) {
for (int i = l; i <= r; ++i) f[i] = L;
return;
}
int mid = (l + r) >> 1, t1 = d.top;
for (int i = mid; i <= min(r, L - 1); ++i)
d.unite(u[i], v[i]), d.unite(inv[u[i]], inv[v[i]]);
int t2 = d.top; bool cur = 1;
for (int i = max(mid, L); i <= R; ++i) {
d.unite(u[i], v[i]), d.unite(inv[u[i]], inv[v[i]]);
cur &= (d.find(u[i]) != d.find(inv[u[i]]));
if (!cur) { f[mid] = i; break; }
}
d.undo(t2), solve(l, mid - 1, L, f[mid]);
d.undo(t1);
for (int i = max(r + 1, L); i < f[mid]; ++i)
d.unite(u[i], v[i]), d.unite(inv[u[i]], inv[v[i]]);
solve(mid + 1, r, f[mid], R);
d.undo(t1);
}

浙公网安备 33010602011771号