2026.9 做题记录
2026.9.1
P14284 [ICPC 2025 WF] Delivery Service
考虑将一个点拆成白天和晚上,记为 \(i_1,i_2\)。
那么一个 \((a,b)\) 的快递员等价于一条 \(a_1,b_2\) 之间的边。这样从某个点出发无论怎么走都一定是白天、晚上交替的了。则 \(u,v\) 联通,当且仅当存在 \(u_x,v_y\) 联通,其中 \(x,y\in \{1,2\}\)。
维护连通块点集,其中 \(i_1,i_2\) 均视作 \(i\)。那么对于一对联通的 \((u,v)\),就有两种可能:
- 存在恰好一个连通块同时包含 \(u,v\) 两点。
- 存在恰好两个连通块同时包含 \(u,v\) 两点。
记 \(S_i\) 为第 \(i\) 个连通块的点集,那么答案等于 \(\sum\limits_{1 \le i\le m}^{}\binom{|S_i|}{2} -\sum\limits_{1 \le i< j \le m}^{}\binom{|S_i\cap S_j|}{2}\)。
注意到 \(|S_i\cap S_j| \ge 1\) 的 \((i,j)\) 只有 \(O(n)\) 对。因为 \(u_{1},u_2\) 只会对最多一对 \((i,j)\) 有贡献。
考虑 dsu 维护这个东西。具体地,维护 \((i,j,k)\) 表示 \(|S_i \cap S_j| = k\),其中 \(k \ge 1\)。
合并点 \(a_1,b_2\):
- 在一个连通块内。不做更改。
- 不在一个联通块内。记 \(a_1\) 所在连通块为 \(x\),\(b_2\) 为 \(y\)。将 \((x,j,k_1)\) 与 \((y,j,k_2)\) 合并成 \((x',j,k_1+k_2)\)。若其中一个不存在则另它的 \(k\) 为 \(0\)。再删除 \((x,y,k)\)(如果有)。然后合并 \(x,y\)。
时间复杂度 \(O(n\log^2 n)\)。
P11360 [CEOI 2015] 管道
先随便求一棵 DFS 树(森林)。
显然桥只会是树边,且满足不存在非树边在树上的路径经过这条树边。
这样做时间复杂度 \(O(n)\),空间复杂度 \(O(m)\)。
考虑优化空间。
发现对于非树边,如果存在环,删去环上任意一条边对答案无影响。
那么非树边也只需要存 \(O(n)\) 条。空间复杂度 \(O(n)\)。
2026.9.2
P4732 [BalticOI 2015] Editor
考虑模拟这个过程。
维护栈表示当前可能被撤销但还没被撤销的元素。
加入一个 \(i\),找到栈中那个被撤销的位置 \(j\)。考虑维护当前栈:
- 对于 \(j\)。它被撤销了,所以不在栈里。
- 对于 \([j+1,i-1]\)。因为 \(i\) 的值比它们都小,位置还靠后,所以不在栈里。
- 对于 \(i\)。它在栈里。
- 对于 \([1,j-1]\)。发现好像不能直接复制(因为 \(j\) 被撤销了)。注意到 \([j+1,i-1]\) 一个操作 \(k\) 不可能撤销 \([1,j-1]\) 中的某个操作,因为如果 \(k\) 撤销了 \([1,j-1]\) 中某个元素 \(w\),应该满足:\(X_w < X_k ,\min\limits_{y=w+1}^{k-1}X_y > X_k\)。则 \(X_j > X_k\),此时 \(i\) 应当撤销 \(k\) 而不应当撤销 \(j\),矛盾。那么 \([1,j-1]\) 中在栈里的元素就和 \(j-1\) 时刻一样了。
用可持久化线段树维护每个时刻的栈即可。时间复杂度 \(O(n\log n)\)。
P16545 [EGOI 2026] 狐狸家族 / Fox Families
考虑维护一个连通块最左和最右的端点,记为 \(L_0,R_0\)。现加入一个 \([L,R]\),讨论它们在什么情况下会合并:
- \([L_0,R_0]\subseteq [L,R]\)。此时显然会合并。
- \([L,R]\subseteq [L_0,R_0]\)。此时也会合并,可能需要一点观察力。因为 \(L_0\) 和 \(R_0\) 可以通过区间相互到达,所以一定存在一个区间 \([L_1,R_1]\),使得 \([L_1,R_1]\) 在这个连通块内且 \(L_1 \le L \le R_1\)。分情况讨论:
- \(R_1 < R\)。同理也会存在 \([L_2,R_2]\) 使得 \(L_2 \le R_1 \le R \le R_2\)。
- 若 \(L_2 \le L\),则 \([L,R]\subseteq [L_2,R_2]\)。会合并。
- 若 \(L < L_2\),则一定存在 \([L_3,R_3]\subseteq [L_2,R_2]\cap [L_1,R_1]\) 即 \([L_3,R_3]\subseteq [L_2,R_1]\)。因为两个相交的区间联通必须存在包含这两个区间的大区间或被它们的交包含的小区间。又因为 \([L_3,R_3]\subseteq [L,R]\),所以会合并。
- \(R \le R_1\)。则 \([L,R]\subseteq [L_1,R_1]\)。会合并。
- \(R_1 < R\)。同理也会存在 \([L_2,R_2]\) 使得 \(L_2 \le R_1 \le R \le R_2\)。
- \(L < L_0 \le R \le R_0\)。维护连通块中区间右端点的最小值 \(R_1\):
- \(R_1 \le R\)。此时一定会合并。理由和 \(2.1.2\) 差不多,存在一个交。
- \(R_1 > R\)。此时一定不会合并。
- \(L_0 \le L \le R_0 < R\)。同理,维护区间左端点的最小值 \(L_1\)。当 \(L_1 \ge L\) 时会合并;否则不会合并。
- 其他情况(不交)。显然不会合并。
那么就只需要维护每个连通块的 \((L_0,R_0,L_1,R_1)\) 了(其中 \(L_1\) 是左端点最大值,\(R_1\) 是右端点最小值)。加入一个 \([L,R]\) 时:
- 将 \(L_1 \ge L\) 中 \(R_0 \le R\) 的合并。
- 将 \(L_0 \le L\) 中 \(R_0 \ge R\) 的合并。
- 将 \(L_0 \ge L\) 中 \(R_1 \le R\) 的合并。
\(L_1\) 增大时 \(R_0\) 增大,\(L_0\) 增大时 \(R_0\) 增大,\(L_0\) 增大时 \(R_1\) 增大。所以用 set 暴力维护修改就行了。时间复杂度 \(O(n\log n)\)。
2026.9.3
CF547D Mike and Fish
将横纵坐标看成两排点,记第 \(x=i\) 为 \(i_x\),第 \(y=i\) 为 \(i_y\)。
那么 \(i_{x}\) 和 \(i_y\) 连边后得到二分图。给二分图边黑白染色,使得每个点的连边中黑白点数量差不超过 \(1\)。
注意到一个奇数度数的点黑白点数量差一定为 \(1\)。考虑建一个虚点来平衡度数。将所有奇数度数的点和这个虚点连一条边,那么所有点的度数都变成偶数了。
这样可以跑从虚点出发的欧拉回路,对于构造,所有左部点走向右部点为黑;右部点走向左部点为白。考虑证明合法性:
- 如果一个点度数是偶数。根据欧拉回路,一定有一半回一半出。黑白数量相同。
- 如果一个点度数是奇数。同理,算上与虚点的边后一定有一半回一半出。又因为和虚点的边不染色,所以黑白数量差 \(1\)。
时间复杂度 \(O(n)\)。
P15869 【MX-X26-T5】「Cfz Round 7」anybody can finds love (expect you)
考虑给每个点的所有边两两配对,表示只要这次是从其中一个进来或出去的,那么下一步就要从另一个出去或进来。
那么只要一个点所有边对应点不存在绝对众数就一定可以这么配对,同时如果存在绝对众数一定无解。
考虑构造,DFS 的时候存 \((u,pre)\) 表示当前点与上一次经过多边。首先如果 \(pre\) 对应的配对边没有走过,那么强制下一步走配对边出去。对于剩下的配对边,由于这些配对边对应点两两不同,所以一定有一个和 \(pre\) 这条边对应的点不同,先走那个就行了。
复杂度 \(O(n+m)\) 或 \(O((n+m)\log n)\)。
AT_agc018_f [AGC018F] Two Trees
首先不难注意到对于任意一个点 \(u\),若其在两棵树中儿子数量奇偶性不同,则一定无解。
先建个虚点把两棵树连起来(和树根连边)。考虑对于一个奇数度数的点 \(i\),将其在两棵树中连起来。
那么所有点的度数都是偶数了。
跑一遍欧拉回路,构造:
- 这条边为 \(T_1\) 中的边或 \(T_2\) 中的边。不管。
- 这条边从 \(T_1\) 到 \(T_2\)。将这个点点权设为 \(1\)。
- 这条边从 \(T_2\) 到 \(T_1\)。将这个点点权设为 \(-1\)。
考虑证明其合法性。将欧拉回路拆成若干个环。对 \(T_1\) 中的点 \(u\) 的所有边分类讨论:
- \(u\) 先走到某个儿子,最后走到 \(T_2\) 中的 \(u\) 或 \(u\) 的某个儿子返回。注意到这样从子树中某个点走到 \(T_2\) 会贡献 \(1\),从 \(T_2\) 回到子树某个点会贡献 \(-1\)。所以整体贡献 \(0\)。
- \(u\) 先走到某个儿子,最后走到 \(u\) 的父亲返回。此时只会贡献 \(1\)。
- \(u\) 先走到 \(T_2\) 中的 \(u\),最后走到 \(u\) 的父亲返回。同样只会贡献 \(1\)。
- \(u\) 先走到 \(u\) 的父亲,最后走到 \(T_2\) 中的 \(u\) 返回,此时只会贡献 \(-1\)。
由于父亲边只能走一次,所以恰好贡献绝对值为 \(1\)。对 \(T_2\) 中的 \(u\) 同理。
时间复杂度 \(O(n)\)。
P3275 [SCOI2011] 糖果
直接差分约束做。
P11095 [ROI 2021] 旅行 (Day 2)
考虑枚举 \(t_{max}\)。把最小生成树建出来。
加入一条边 \((u,v,t_{max})\):
- 是最小生成树上的边。设 \(u\) 深度较小。
- 维护 \(f_x\) 为 \(x\) 到 \(1\) 边权最小值,将 \(v\) 子树中所有点的 \(f_x\) 对 \(t_{max}\) 取 \(\min\)(初始化 \(+\infin\))。
- 不是最小生成树上的边,此时会形成边双。注意到一个边双中的边都是可以经过的。所以考虑将 \(P(u,v)\) 中所有边双合并,其中 \(P(u,v)\) 为树上 \(u\) 到 \(v\) 的路径。
- 维护 \(g_x\) 为与 \(x\) 在一个边双且深度最小的祖先,\(h_x\) 为 \(x\) 所在边双边权最小值。记 \(w\) 为 \(\text{lca}(u,v)\) 所在连通块。那么分别从 \(u,v\) 开始跳,每次跳到 \(fa_{g_x}\),并维护一路上 \(h_x\) 与 \(t(g_x,fa_{g_x})\) 的最小值,直到跳到 \(g_x = w\)。最后将一路上所有点的 \(g\) 合并成 \(w\),并将 \(h_w\) 更新。显然,跳一次就会合并一次,所以均摊 \(O(n)\)。
- 将 \(w\) 子树中所有点的 \(f_x\) 对 \(h_w\) 取 \(\min\)。
- 维护 \(ans_x\) 为 \(x\) 的答案,将 \(w\) 子树中所有点的 \(ans_x\) 对 \(h_w + t_{max}\) 取 \(\min\)(初始化 \(+\infin\))。
再考虑一个点的真实答案。注意到 \(x\) 和 \(1\) 联通之前 \(ans_x\) 都是假的,所以维护一下每个点和 \(1\) 联通的时间,在枚举到这个时间时将 \(ans_x\) 改成 \(f_x + t_{max}\) 即可。
时间复杂度 \(O(n\log n)\)。线段树需要维护区间取 \(\min\),单点查询,单点修改。
P4630 [APIO2018] 铁人两项
考虑如果 \(s,f\) 确定,\(c\) 有多少种选法。显然 \(c\) 的数量等于 \(s\) 到 \(f\) 所有简单路径并的大小减 \(2\)。
由一个点双中任意 \(3\) 点 \(x,y,z\) 都存在 \(x\) 到 \(y\) 到 \(z\) 的路径得知,\(s\) 到 \(f\) 所有简单路径并等价于 \(s\) 到 \(f\) 所有点双并。
把圆方树建出来,那么这个并的大小减去 \(2\) 的值就等于将方点权值设为点双大小,园点权值设为 \(-1\) 后 \(s\) 到 \(f\) 路径权值和。
DFS 一遍,在 \(\text{lca}\) 处统计即可。时间复杂度 \(O(n + m)\)。
P6378 [PA 2010] Riddle
考虑 2-SAT。
记 \(c_i\) 为第 \(i\) 个点所属部分的编号。记 \(i_0\) 为不选 \(i\),\(i_1\) 为选 \(i\)。
对于一条边 \((u,v)\),\(u_0\) 向 \(v_1\) 连,\(v_0\) 向 \(u_0\) 连,得到至少选一个的限制。
对于一个部分 \(i\),记其点集为 \(S\)。那么一个 \(x\in S\) 需要 \(x_1\) 向 \(y\in S\land y\ne x\) 的 \(y_0\) 连,得到不能选两个以上的限制。这个前缀、后缀优化一下连边就行了。
直接对这个跑一遍 2-SAT。对于第 \(i\) 个部分:
- \(c_x = i\) 中选择的点数量不小于 \(2\)。由上面的连边方式得知不可能存在。
- \(c_x = i\) 中选择的点数量等于 \(1\)。合法。
- \(c_x = i\) 中选择的点数量等于 \(0\)。说明对于所有 \(c_u = i\) 的 \((u,v)\) 都满足 \(c_v \ne i\)。因为如果 \(c_v = i\) 显然不满足至少选一个的限制。那么此时任意再选一个 \(c_u = i\) 的点也是可以的。所以合法。
时间复杂度 \(O(n+m)\)。

浙公网安备 33010602011771号