2026.9 做题记录 1

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)\),就有两种可能:

  1. 存在恰好一个连通块同时包含 \(u,v\) 两点。
  2. 存在恰好两个连通块同时包含 \(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\):

  1. 在一个连通块内。不做更改。
  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\)。考虑维护当前栈:

  1. 对于 \(j\)。它被撤销了,所以不在栈里。
  2. 对于 \([j+1,i-1]\)。因为 \(i\) 的值比它们都小,位置还靠后,所以不在栈里。
  3. 对于 \(i\)。它在栈里。
  4. 对于 \([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]\),讨论它们在什么情况下会合并:

  1. \([L_0,R_0]\subseteq [L,R]\)。此时显然会合并。
  2. \([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\)。分情况讨论:
    1. \(R_1 < R\)。同理也会存在 \([L_2,R_2]\) 使得 \(L_2 \le R_1 \le R \le R_2\)。
      1. 若 \(L_2 \le L\),则 \([L,R]\subseteq [L_2,R_2]\)。会合并。
      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]\),所以会合并。
    2. \(R \le R_1\)。则 \([L,R]\subseteq [L_1,R_1]\)。会合并。
  3. \(L < L_0 \le R \le R_0\)。维护连通块中区间右端点的最小值 \(R_1\):
    1. \(R_1 \le R\)。此时一定会合并。理由和 \(2.1.2\) 差不多,存在一个交。
    2. \(R_1 > R\)。此时一定不会合并。
  4. \(L_0 \le L \le R_0 < R\)。同理,维护区间左端点的最小值 \(L_1\)。当 \(L_1 \ge L\) 时会合并;否则不会合并。
  5. 其他情况(不交)。显然不会合并。

那么就只需要维护每个连通块的 \((L_0,R_0,L_1,R_1)\) 了(其中 \(L_1\) 是左端点最大值,\(R_1\) 是右端点最小值)。加入一个 \([L,R]\) 时:

  1. 将 \(L_1 \ge L\) 中 \(R_0 \le R\) 的合并。
  2. 将 \(L_0 \le L\) 中 \(R_0 \ge R\) 的合并。
  3. 将 \(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. 如果一个点度数是偶数。根据欧拉回路,一定有一半回一半出。黑白数量相同。
  2. 如果一个点度数是奇数。同理,算上与虚点的边后一定有一半回一半出。又因为和虚点的边不染色,所以黑白数量差 \(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\),将其在两棵树中连起来。

那么所有点的度数都是偶数了。

跑一遍欧拉回路,构造:

  1. 这条边为 \(T_1\) 中的边或 \(T_2\) 中的边。不管。
  2. 这条边从 \(T_1\) 到 \(T_2\)。将这个点点权设为 \(1\)。
  3. 这条边从 \(T_2\) 到 \(T_1\)。将这个点点权设为 \(-1\)。

考虑证明其合法性。将欧拉回路拆成若干个环。对 \(T_1\) 中的点 \(u\) 的所有边分类讨论:

  1. \(u\) 先走到某个儿子,最后走到 \(T_2\) 中的 \(u\) 或 \(u\) 的某个儿子返回。注意到这样从子树中某个点走到 \(T_2\) 会贡献 \(1\),从 \(T_2\) 回到子树某个点会贡献 \(-1\)。所以整体贡献 \(0\)。
  2. \(u\) 先走到某个儿子,最后走到 \(u\) 的父亲返回。此时只会贡献 \(1\)。
  3. \(u\) 先走到 \(T_2\) 中的 \(u\),最后走到 \(u\) 的父亲返回。同样只会贡献 \(1\)。
  4. \(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})\):

  1. 是最小生成树上的边。设 \(u\) 深度较小。
    1. 维护 \(f_x\) 为 \(x\) 到 \(1\) 边权最小值,将 \(v\) 子树中所有点的 \(f_x\) 对 \(t_{max}\) 取 \(\min\)(初始化 \(+\infin\))。
  2. 不是最小生成树上的边,此时会形成边双。注意到一个边双中的边都是可以经过的。所以考虑将 \(P(u,v)\) 中所有边双合并,其中 \(P(u,v)\) 为树上 \(u\) 到 \(v\) 的路径。
    1. 维护 \(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)\)。
    2. 将 \(w\) 子树中所有点的 \(f_x\) 对 \(h_w\) 取 \(\min\)。
    3. 维护 \(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\) 个部分:

  1. \(c_x = i\) 中选择的点数量不小于 \(2\)。由上面的连边方式得知不可能存在。
  2. \(c_x = i\) 中选择的点数量等于 \(1\)。合法。
  3. \(c_x = i\) 中选择的点数量等于 \(0\)。说明对于所有 \(c_u = i\) 的 \((u,v)\) 都满足 \(c_v \ne i\)。因为如果 \(c_v = i\) 显然不满足至少选一个的限制。那么此时任意再选一个 \(c_u = i\) 的点也是可以的。所以合法。

时间复杂度 \(O(n+m)\)。

2026.9.4

P5332 [JSOI2019] 精准预测

只保留有用的点,即预测中 \(2m\) 个点和最后 \(T+1\) 时刻的 \(n\) 个点。

用 2-SAT 跑一遍后一个点的答案就等价于 \(n-1\) 减去它能到达的 \((y,T+1,0)\)(即推出死亡的点)。

缩点之后就是一个 DAG 可达性统计。复杂度 \(O(\frac{nm}{\omega})\)。

QOJ10706 Red-Blue MST

考虑先将最小生成树建出来。考虑一个不在最小生成树上的红边,容易得知,它如果要替换一条蓝边,那么这条蓝边应该满足:

  • 将所有边权比该红边小的红边,边权比该蓝边小的蓝边,最小生成树上的红边连起来后,该红边 \((u,v)\) 两点不联通。且加入该蓝边后 \((u,v)\) 联通。

那么直接对这个做整体二分。时间复杂度 \(O(n\log^2 n)\),要可撤销并查集。

P6643 [CCO 2020] Mountains and Valleys

注意到非树边最多走一条,证明简单。

考虑枚举起点 \(s\),终点 \(t\) 和这条非树边 \((u,v,w)\)。记 \(p(u,v)\) 为 \(u\) 到 \(v\) 简单路径经过的边集。

容易发现,这样的代价就是 \(2(n-1)-\text{dis}(s,t) -\text{dis}(u,v) + w +2\max(0,|p(u,v)\cap p(s,t)|-1)\)。也就是从 \(s\) 走到某个点 \(x\),再走到 \(u\),经过非树边到 \(v\),再走到某个点 \(y\),然后返回去把 \(p(x,y)\) 连接的点走完,最后走到 \(t\)(不重要的边显然都会经过两次,不必在意)。

考虑点分治维护这个东西。那么我们只需要对经过分治中心的非树边 \((u,v)\)(因为如果在同一个子树内,在之后的分治一定会算到)。

简单 DP 算一下就可以做到 \(O(siz)\)。

由于最多分治两层,所以整体 \(O(n+m)\)。

QOJ7837 挑战积和式

注意到 $\prod b_i $ 可以分解成 \(x\times y\) 的形式,且 \(x,y\le \max(n,V^{\frac{2}{3}})\)。由于 \(n \le 10^6,V^{\frac{2}{3}}\le10^6\),所以看作同阶。

注意到 \(b_i \ge 2\) 的只会选 \(O(\log V)\) 个。

定义状态函数 \(f_{x,i}\) 为 \(\prod b = x\),且选择了 \(i\) 个 \(b \ge 2\) 时,\(\sum a\) 的最大值。转移为:\(f_{y\times b_x, i+1}\gets f_{y,i}+a_{b_x}\)。复杂度 \(O(n\log n\log V)\)。

考虑对于最终答案,维护 \(g_x\) 为选择 \(x\) 个 \(b\ge 2\) 时,\(\sum a - \prod b\) 的最大值。则 \(g_{x+y} \gets f_{a,x}+f_{b,y}-a\times b\)。答案为 \(\max(a_1 \times (k - x) + g_x)\)。

显然 \(g_x\) 可以通过维护凸包得到。时间复杂度 \(O(n\log V)\)。

2026.9.5

P10357 [PA 2024] Żelki

考虑先背包求出 \(f_{x}\) 为每种颜色选择一个,使得重量和对 \(m\) 取模的结果为 \(x\) 时的最小花费。这个的时间复杂度 \(O(nm)\)。

然后就变成同余最短路了。\(i\) 向 \((i+j)\bmod m\) 连边权为 \(f_{j}\) 的边,则对于 \(r\) 的答案就等于从 \(0\) 走到 \(r\) 的最短路。由于 \(|E| = |V|^2\),所以跑 dij 的时间复杂度 \(O(m^2)\)。

整体时间复杂度 \(O(nm+m^2)\)。

AT_arc076_d [ARC076F] Exhausted?

有 Hall 定义得知,最大匹配等于左部点数减去 \(\max(|S|-|N(S)|)\)。

对于这题,答案显然就是没有匹配的左部点数量,即 \(\max(0,\max(|S|-|N(S)|))\)。

如果已知 \(S\),注意到 \(N(S) = [1,\max\limits_{x\in S}^{}L_x]\cup [\min\limits_{x\in S}^{}R_x,m]\)。所以 \(|S| - |N(S)| =|S| - m+(\min\limits_{x\in S}^{}R_x - \max\limits_{x\in S}^{}L_x -1)\)。

将区间按照 \(R_i\) 从大到小排序,扫 \(R\),维护 \(f_{L}\) 表示 \(\max\limits_{x\in S}^{}L_x = L\) 时,\(|S|-L\) 的最大值。那么加入一个区间 \([L_i,R_i]\) 时:

  • 对 \(L \ge L_i\),将 \(f_L\) 增加 \(1\)。
  • 更新答案 \(ans\gets \max(ans,(\max f_L) -m+ R_i-1)\)。

初始化 \(f_L = -L\)。

线段树做到 \(O(n\log n)\)。

P7816 「Stoi2029」以父之名

P15869 + CF547D 属于是。

考虑一个点的所有边两两配对。显然尽量 \((2,2),(1,1)\) 配对就这么配。最后只会是剩下一个 \(1\) 或剩下 \((2,1)\)。前一种情况的点用一个大虚点连起来让它们度数变成偶数,后一种直接配对。

最后跑一遍欧拉回路,怎么走的边就怎么定向。时间复杂度 \(O(n+m)\)。

P13592 [NWRRC 2023] Loops

注意到对于每一行的点,可以钦定其值是单调递增的,因为这三种图每个都存在一组构造,使得第一行两个数单增且第二行两个数单增。

容易发现,此时如果给第一列确定一个顺序,后面每个 \(2\times 2\) 的图边的顺序都是唯一确定的。不妨设第一列从上往下是单增的。那么就可以 \(O(nm)\) 得到大小关系了。

显然这么做完之后不会有环,跑拓扑排序即可。时间复杂度 \(O(nm)\)。

CF2061G Kevin and Teams

注意到 \(k = \lfloor\frac{n+1}{3}\rfloor\)。

证明考虑构造一个前 \(m\) 个点为完全图,剩下点为孤立点的图。那么该图的匹配数量为 \(\lfloor\frac{m}{2}\rfloor\),补图的匹配数量为 \(\min(n-m,m)+\lfloor\frac{n-2m}{2}\rfloor\)。不难得之 \(\max\limits_{m}\max(\lfloor\frac{m}{2}\rfloor,\min(n-m,m)+\lfloor\frac{n-2m}{2}\rfloor) = \lfloor\frac{n+1}{3}\rfloor\)。

对于构造,考虑将是朋友看成黑边,不是朋友看成白边。维护一个同色的链,每次查询一个点 \(i\) 和当前链尾的点。

  1. 若得到的颜色相同。连在链尾后面。
  2. 若得到的颜色不同。设链尾上一个点为 \(x\),链尾为 \(y\)。将 \((x,y),(y,i)\) 分别加入两种颜色的答案集合,并删去 \(x,y\) 两点。

这样的话一次情况 \(2\) 会消耗 \(3\) 个点,并将两种颜色集合的答案增加 \(1\)。设最终链上有 \(x\) 个点,那么选择与这条链颜色相同的答案集合作为最终答案,并把链上相邻两个当作一组,可以得到 \(k=\lfloor\frac{x}{2}\rfloor+\frac{n-x}{3}\ge \lfloor\frac{n+1}{3}\rfloor\)。

时间复杂度 \(O(n)\)。

2026.9.7

AT_agc036_d [AGC036D] Negative Cycle

对于边,分 \(3\) 种情况:

  1. \(j = i + 1\)。\(i\to j\) 边权为 \(0\)。
  2. \(j>i\)。\(i\to j\) 边权为 \(-1\)。
  3. \(j<i\)。\(i\to j\) 边权为 \(1\)。

不难发现,这个等价于对于一个数组 \(x_{0\sim n-1}\),有限制:

  1. \(x_{i}+(0)\ge x_{i+1}\)。
  2. 对于 \(j>i\),\(x_i+(-1) \ge x_j\)。
  3. 对于 \(j<i\),\(x_i+(1) \ge x_j\)。

要求 \(x_{0\sim n-1}\) 有解。

把 \(x_{0\sim n-1}\) 看成前缀和,那么等价于:

  1. \(a_i \le 0\)。
  2. 对于边权为 \(-1\) 的边 \(i\to j\),\(\sum\limits_{x=i+1}^{j}a_x \le -1\)。
  3. 对于边权为 \(1\) 的边 \(i\to j\),\(\sum\limits_{x=j+1}^{i}a_x \ge -1\)。

整体取个反,相当于:

  1. \(a_i \in \{0,1\}\)。
  2. 对于边权为 \(-1\) 的边 \(i\to j\),\([i+1,j]\) 中至少 \(1\) 个 \(1\)。
  3. 对于边权为 \(1\) 的边 \(i\to j\),\([j+1,i]\) 中最多 \(1\) 个 \(1\)。

要求 \(a_{0\sim n-1}\) 有解。

定义状态函数 \(f_{i,j,k}\) 为前 \(i\) 个下标,最后一个 \(1\) 在 \(j\),倒数第二个 \(1\) 在 \(k\) 的最小代价。那么可以知道,对于右端点为 \(i\) 的区间 \([l,i]\),应该满足:

  1. \(l\in [1,k]\)。区间 \([l,i]\) 中有至少 \(2\) 个 \(1\)。此时所有 \(v+1 \in [1,k],u=i\) 的边 \(u\to v\) 应该删掉。
  2. \(l\in [k+1,j]\)。区间 \([l,i]\) 中恰好有 \(1\) 个 \(1\)。任意限制都满足。
  3. \(l\in [j+1,i]\)。区间 \([l,i]\) 中没有 \(1\)。此时所有 \(u+1\in [j+1,i],v=i\) 的边 \(u\to v\) 应该删掉。

维护两种限制的前缀和,可以 \(O(1)\) 得到需要删掉的边的代价和,记为 \(w(j,k,i)\)。那么转移为:

  1. \(f_{i,j,k}=f_{i-1,j,k}\)。
  2. \(f_{i,i,j}=\min\limits_{k\le j}^{}f_{i-1,j,k}\)。
  3. \(f_{i,j,k}\gets f_{i,j,k}+w(j,k,i)\)。

初始化 \(f_{0,0,0}=0\),答案为 \(\min f_{n,j,k}\)。时间复杂度 \(O(n^3)\)。

P13358 [GDCPC 2024] 小班课

结论:

如果按照意向度从高到低的优先级跑匈牙利,那么一定存在一个点 \(x\),使得 \(x\) 匹配到了他意向度最高的点。

证明:

考虑反证。假设不存在这样的点 \(x\),那么匹配方式一定形如:\(x_1\to c_1\to x_2\to c_2\dots\to x_k\to c_k\to x_1\)。其中 \(x_i\) 为左部点,\(c_i\) 为 \(x_i\) 意向度最高的点,\(c_i\to x_{i+1}\) 为实际上这个右部点匹配的左部点。

不妨设当前尝试匹配的点为 \(x_1\)。

由于 \(c_1\) 是 \(x_1\) 意向度最高的点,所以在增广 \(x_k\) 时如果 \(c_k\) 被 \(x_1\) 选择了,说明之前 \(x_1\) 尝试匹配 \(c_1\) 就已经失败了。此时不可能 \(x_1\) 在已经匹配了 \(c_k\) 的情况下又来尝试匹配 \(c_1\)。故不存在这种情况。

有这个结论,不难发现答案就等于最大匹配。

这样每次跑最大匹配,然后选一个可以的点复杂度是 \(O(n^4)\) 的。

考虑随便跑一个最大匹配然后调整。

对于每个 \(i\),设其意向度最高的点为 \(c_i\) 且 \(c_i\) 被 \(x_i\) 匹配了。$i $ 向 \(x_i\) 连边。得到的是内向基环树森林。

发现对于一个环 \(x_1\to x_2\dots \to x_k \to x_1\),可以直接让他们匹配到自已意向度最高的点 \(c_{x_i}\)(相当于是整体右移一步)。这样整个环就都消去了。

之后再这样连边,就又是很多基环树。

显然最后一定能消完。复杂度 \(O(n^3)\)。

P10846 [EGOI 2024] Team Coding / 团队编程

记 \(cnt_{i,x}=\sum\limits_{u=1}^{n}[col_u = x\land dep_u = i]\),\(h_{i,x} = \sum\limits_{u=1}^{n}[u\in T(x)\land dep_u = i]\)。

枚举选择的根 \(u\),那么贡献为 \(\sum \limits_{}^{}\min(cnt_{i,col_u},h_{i,u})\)。有注意到当存在 \(col_v = col_u\),且 \(v\) 是 \(u\) 祖先时,\(u\) 一定不会成为被选择的根。

首先 \(cnt_{i,x}\) 可以一次 DFS 得到。\(h_{i,u}\) 可以 dsu on tree 得到。

对于一个可能被选择为根的点 \(u\),暴力枚举子树中所有 \(cnt_{i,col_u}>0\) 的 \(i\) 并计算 \(\min(cnt_{i,col_u},h_{i,u})\) 再求和。这样就可以得到 \(\sum \min(cnt_{i,col_u},h_{i,u})\) 了。

考虑分析时间复杂度。不难发现实际上一个颜色 \(x\) 相当于被分进了若干个子树 \(T(p_1),T(p_2),\dots,T(p_k)\),且满足对于任意 \(i\ne j\),\(T(p_i)\cap T(p_j)=\emptyset\)。因为如果 \(T(p_i)\cap T(p_j)\ne \emptyset\),那么一定存在一个更浅的点同时包含这两个子树且颜色为 \(x\)。记 \(s_x = \sum [cnt_{i,x}> 0]\),那么复杂度就是 \(O(s_xk_x)\) 的。有:

  1. \(k_x \le \frac{n}{s_x}\)。
  2. \(\sum k_x = n\)。

所以总枚举量不超过 \(s \times \min(n,\frac{n^2}{s^2})\)。当 \(\frac{n^2}{s^2}=n\) 即 \(s=\sqrt{n}\) 时取到上界为 \(O(n\sqrt{n})\)。

算上 dsu on tree 的复杂度就是 \(O(n\sqrt{n}+n\log n)\)。

P16997 【MX-S15-T3】「DLESS-5」旅游定价

将 \(|x-a_i|-q_i\) 看成函数 \(f(x) = |x-a_i|-q_i\)。那么相当于是一个以 \((a_i,-q_i)\) 为起点,两边斜向上延伸到 V 字形函数。

那么对于一个 \(x\),\(\min |x-a_i|-q_i\) 就是这 \(n\) 个 V 字形函数保留交点以下的部分(取 \(\min\))得到的折线上 \(x\) 对应横坐标值。

对于一个 \(q_i\),若 \(x= a_i\) 对应横坐标值小于 \(-q_i\),显然增大 \(q_i\) 不劣。在不改变折线的情况下最多增大到 \((a_i,-q_i)\) 落在折线上。

对于一个 \(p_i\),显然取到的最大值就是 \(x\in S_i\) 中 \(x\) 对应横坐标的最大值。

则最优情况下 \(p_i\) 与 \(-q_i\) 均落在折线上。

定义状态函数 \(f_{i,s,0/1}\) 为考虑到 \(q_i\),\(x\in [i-15,i]\) 的折线变化状态为 \(s\) (\(0\) 为向右下,\(1\) 为向右上),且 \((i,i+1)\) 的折线状态为 \(0/1\) 时的贡献和最大值。

将 \(c_{i,j}\) 与 \(a_i\) 放一起从小到大排序。考虑相邻两个纵坐标 \(x\) 与 \(pre\) 的转移:

  1. \((pre,pre+1)\) 状态为 \(0\)。
    1. \(x\) 上面没有 \(a_i\)。状态与之前同样为 \(0\),则在 \(s\) 后面添加 \(i - pre\) 个 \(0\)。记添加后并保留最后 \(15\) 个的状态为 \(s'\);弹出的变化值为 \(\Delta\)(弹出一个 \(0\) 为 \(-1\),弹出一个 \(1\) 为 \(1\));\([x,+\infin)\) 中还有 \(cnt\) 个未被计算贡献的点。有:\(f_{x,s',0}\gets f_{pre,s,0}+\Delta\times cnt\)。
    2. \(x\) 上面有 \(a_i\)。依旧为 \(0\)。\(f_{x,s',1}\gets f_{pre,s,1}+\Delta \times cnt\)。
  2. \((pre,pre+1)\) 状态为 \(1\)。
    1. \(x\) 上面没有 \(a_i\)。同样为 \(1\)。\(f_{x,s',1}\gets f_{pre,s,1} +\Delta\times cnt\)。
    2. \(x\) 上面有 \(a_i\)。枚举状态是 \(111\dots 100\dots 0\),其中 \(1\) 有 \(C\) 个。依旧更新的状态为 \(s’\)。有:\(f_{x,s',1}\gets f_{pre,s,1}+\Delta \times cnt\)。这样的 \(s’\) 有 \(O(k)\) 个。

最后考虑更新 \(p_i\)。因为 \(s\) 为 \([x-15,x]\) 的折线状态,所以可以 \(O(k)\) 得到 \(p_i\) 的相对值,记为 \(\delta\)。更新 \(f_{x,s,k}\gets f_{x,s,k} + \delta\)。时间复杂度 \(O(2^kk)\)。

整体时间复杂度 \(O(nk2^k)\)。

2026.9.8

CF1844G Tree Weights

先给所有边的边权赋成 \(1\),然后 \(d_i \gets d_i - dis(i,i+1)\)。

找到当前 \(d\) 的最小值,设其为 \(d_{x}\)。在 \(P(x,x+1)\) 上找一条边 \((u,v)\)(没被使用的),将 \(w(u,v)\) 设成 \(d_x+1\)。并对所有经过 \((u,v)\) 的 \(P(y,y+1)\),将 \(d_y\) 减去 \(d_{x}\)。最后删去 \(d_x\),并将 \((u,v)\) 标记为已使用。

如果能给每对 \((i,i+1)\) 都分配一条边 \((u,v)\),那么一定是存在合法解的(不考虑 \(d_i < dis(i,i+1)\))。因为这样做保证了任意时刻 \(d_i\ge 0\),且轮到 \((i,i+1)\) 时让 \(d_i\) 变成了 \(0\)。

尝试通过删叶子的方式来分配。以 \(1\) 为树根。随便找一个叶子 \(u\):

  1. 新建一个点 \(c\)。
  2. 若 \(u-1\) 不在 \(u\) 子树内。连边 \((c,u-1)\)。
  3. 若 \(u+1\) 不在 \(u\) 子树内。连边 \((c,u)\)。

那么会得到若干条链。

对于某条链的前两个点 \((c,u)\),如果将 \(c\) 对应的边分配给 \((u,u+1)\),那么后面就都是确定的。

如果出现某条链 \(c\) 的数量与 \(u\) 的数量不同,显然就无解了。

这样分配的时间复杂度 \(O(n)\)。但是模拟的过程有点困难了。

原来不是这样做吗。

考虑以 \(1\) 为根。记 \(x_i\) 为 \(i\) 到 \(1\) 边权和。那么限制为:

  • \(x_i + x_{i+1}-2x_{\text{lca}(i,i+1)}=d_i\)。

已知 \(x_1 = 0\)。从小到大枚举 \(i\),但问题是可能 \(\text{lca}(i,i+1) \ge i+1\)。

注意到 \(x_{\text{lca}(i,i+1)}\) 前面有个 \(2\) 的系数,想到先对 \(2\) 取模。变成:

  • \((x_i + x_{i+1})\bmod 2=d_i\bmod 2\)。

此时就可以推出 \(x_{2\sim n}\bmod 2\) 的值。再考虑对 \(4\) 取模,变成:

  • \((x_i + x_{i+1} -2(x_{\text{lca}(i,i+1)}\bmod 2))\bmod 4=d_i\bmod 4\)。

同样可以推出 \(x_{2\sim n}\bmod 4\) 的值。

重复下去,就可以知道 \(x_{i}\bmod V\) 的值。当 \(V> x_i\) 时就不再需要继续推了。

最后再 check 一下是否满足边权都 \(\ge 1\) 即可。时间复杂度 \(O(n\log n + n\log V)\)。

QOJ837 Giant Penguin

随便找棵 DFS 树然后点分治。

对于当前分治中心 \(u\),因为需要处理的信息必须跨过 \(u\),所以有用的非树边只有 \(O(k)\) 条(一条非树边贡献一个环)。而对于点 \(x\) 到 \(y\) 的最短路,可以枚举一个必经点 \(c\),一定存在一个 \(c\) 使得 \(\text{dis}(x,y)=\text{dis}(x,c)+\text{dis}(c,y)\)。而这样的 \(c\) 只需要取 \(u\) 和这 \(O(k)\) 条非树边的端点。

那么以这 \(2k+1\) 个点为起点 BFS 得到最短路,查询时直接枚举这个 \(c\) 即可。

时间复杂度 \(O(nk\log n)\)。

CF1458F Range Diameter Sum

树上圆理论。

  • 记 \(f(u,r)\) 为距离 \(u\) 不超过 \(r\) 的点构成的邻域。
  • 设 \(c(S)=f(u,r)\) 为包含点集 \(S\) 的最小邻域。这里令 \(x,y\) 为 \(S\) 中最远两个点,\(u\) 为 \(x,y\) 路径中点(可能是边的中点),\(d\) 为 \(x,y\) 的距离。则 \(r = \frac{d}{2}\)。即 \(c(S) = f(u,\frac{d}{2})\)。

有一些性质:

  1. 邻域 \(f(u_1,r_1)\) 包含邻域 \(f(u_2,r_2)\),当且仅当 \(r_1\ge r_2+\text{dis}(u_1,u_2)\)。
  2. 对于合并两个点集 \(S_1,S_2\) 得到 \(c(S_1\cup S_2)\),有:
    1. \(S_1\) 包含 \(S_2\)。\(c(S_1\cup S_2)=c(S_1)\)。
    2. \(S_2\) 包含 \(S_1\)。\(c(S_1\cup S_2)=c(S_2)\)。
    3. \(S_{1}\) 与 \(S_2\) 无包含关系。令 \(d = \text{dis}(u_1,u_2)\),则 \(c(S_1\cup S_2)=f(\text{move}(u_1,u_2,\frac{d-r_1+r_2}{2}),\frac{d+r_1+r_2}{2})\)。其中 \(\text{move}(u,v,w)\) 为 \(u\) 向 \(v\) 移动 \(w\) 的距离到达的点。
  3. 对于点集 \(S\),任意一个点 \(v\) 到 \(S\) 中最远点的距离为 \(\text{dis}(u,v) + r\)(\(c(S)=f(u,r)\))。

对于这题,考虑分治。

记 \(s(i)\) 为 \(i\) 到 \(\text{mid}\) 构成的点集。

如果已知 \(c(\{l,l+1,\dots,r\})=c(s(l)\cup s(r)) = f(u,R)\),那么 \(\text{diam}(l,r) = 2R\)。

枚举 \(l\),维护指针 \(i,j\) 使得:

  1. \(r\in [\text{mid}+1,i]\) 均有 \(c(s(l))\) 包含 \(c(s(r))\)。设 \(c(s(l))=f(u,R)\),则 \(\text{diam}(l,r)=2R\)。
  2. \(r\in [i+1,j]\) 均有 \(c(s(l))\) 与 \(c(s(r))\) 无包含关系。设 \(c(s(l))=f(u_1,R_1),c(s(r))=f(u_2,R_2)\),则 \(\text{diam}(l,r)=R_1+R_2+\text{dis}(u_1,u_2)\)。
  3. \(r\in [j+1,r_0]\) 均有 \(c(s(r))\) 包含 \(c(s(l))\)。设 \(c(s(r))=f(u,R)\),则 \(\text{diam}(l,r)=2R\)。

先考虑维护出 \(c(s(i))\),首先 \(c(s(\text{mid}))=f(\text{mid},0)\)。以 \(c(s(l))\) 举例,设 \(c(s(l+1))=f(u,R)\):

  1. \(\text{dis}(l,u)\le R\)。则 \(c(s(l))=c(s(l+1))\)。
  2. \(\text{dis}(l,u)>R\)。则 \(c(s(l)) = f(\text{move}(l,u,\frac{\text{dis}(l,u)-0+R}{2}),\frac{\text{dis}(l,u)+0+R}{2})\)。

维护出 \(c(s(i))\) 后情况 \(1,3\) 都是简单的。情况 \(2\) 中 \(R_1+R_2\) 也是简单的。对于 \(\text{dis}(u_1,u_2)\),相当于是查询某个点到当前所有关键点距离和,点分树即可。

那么只需要实现 \(\text{move}\) 函数,\(\text{dis}\) 函数,点分树和分治。为了方便计算 \(R\),可以给每条边中间加一个虚点,这样只需要最后答案除以 \(2\)。

整体时间复杂度 \(O(n\log^2 n)\)。

CF1168D Anagram Paths

考虑先判定一棵树是否是变为字母异位树。

  1. 所有叶子深度相同。
  2. 记 \(cnt_{u,x}\) 为 \(u\) 到子树叶子中 \(x\) 出现次数的最大值。那么需要满足 \(\sum\limits_{x='a'}^{'z'}cnt_{u,x}\le \text{mdep}(u)-\text{dep}(u)\)。

容易发现,对于 \(f(c)\) 其实就等于 \(\text{mdep}(1)-\text{dep}(1) - \sum\limits_{x='a'}^{'z'}cnt_{1,x} + cnt_{1,c}\)。

那么有:\(\sum\limits_{c=1}^{26}f(c) = 351(\text{mdep}(1)-\sum\limits_{x=1}^{26}cnt_{1,x})+\sum\limits_{x=1}^{26}x\times cnt_{1,x}\)。

每个点上维护 \(cnt_{u,x}\)。那么修改点 \(p\) 和 \(fa_p\) 之间的字符影响的就是一条 \(p\) 到某个祖先的链。二分这个祖先即可。然后就是对一条链的 \(cnt_{u,x}\) 增加或减少 \(1\)。最后整体维护全局最小值。需要 \(27\) 棵线段树。

时间复杂度 \(O(n|\sum|\log n + n\log^2 n)\)。这个也可以做到一个 \(\log\)。

注意到因为叶子深度相同,所以一个点到根中有两个儿子的祖先只有 \(O(\sqrt{n})\) 个。那么暴力跳这些祖先的时间复杂度就是 \(O(n\sqrt{n}+n|\sum|)\) 的。

2026.9.9

P10789 [NOI2024] 登山

先将 \(a\) 序列简化,即删去所有 \(p_{a_j}=a_{j-1}\) 的 \(a_j\)。得到的应该是 \(x\) 到 \(1\) 路径上的某些点,且深度单调递减。

再在 \(a_i\) 和 \(a_{i+1}\) 中添加若干个休息的点,设 \(a_i\) 与 \(a_{i+1}\) 中添加的最后一个休息点为 \(p\)(没有则令 \(p=a_i\))。考虑 \(a_{i+1}\) 的合法条件:

  1. \(d_{a_{i+1}}<\min\limits_{u\in P(p,a_{i})}^{}(d_u-h_u)\)。
  2. \(d_p - r_{p}\le d_{a_{i+1}} \le d_{p} -l_p\)。

定义状态函数 \(f_{u}\) 为从 \(u\) 出发的方案数。那么枚举 \(u\) 再枚举 \(p\),可以得到合法的下一个冲刺点范围,通过前缀和可以 \(O(1)\) 得到方案数之和。这样复杂度是 \(O(n^2)\) 的。

先考虑 \(l_i = r_i\) 怎么做。

对于 \(p\),设下一个冲刺点为 \(x\)。则 \(d_{p}-r_p \le d_x \le d_p-l_p\),也就是 \(d_x = d_p-l_p\)。此时满足 \(d_x < \min\limits_{v\in P(p,u)}^{}(d_v - h_v)\) 的 \(u\) 应该是从 \(P(p,1)\) 的一段前缀。可以二分找到这个前缀的结尾 \(u_0\),那么所有 \(u\in P(p,u_0)\) 的 \(f_u\) 都可以得到 \(f_{x}\) 的贡献。显然 \(d_x < d_{u_0}\) 所以不会转移出错。

具体做法就是 DFS 一遍,得到 \(f_{x}\) 之后将 \(x\) 子树中所有满足 \(d_{x} = d_{p}-l_p\) 的 \(p\) 拿出来,对每个 \(p\) 找到这样的 \(u_0\),然后将 \(u\in P(p,u_0)\) 的 \(f_u\) 都加上 \(f_x\)。复杂度 \(O(n\log^2 n)\)。

如果 \(l_i \ne r_i\)。

设 \(g_{u}=\sum\limits_{x\in P(u,1)}^{}f(x)\),相当于一个前缀和。对于 \(p\),设转移点为 \(u\)。条件变成 \(d_{p}-r_{p} \le d_x < \min(d_p-l_p+1,\min\limits_{v\in P(p,u)}^{}(d_v-h_v))\)。记 \(h(p,u)=\min(d_p-l_p+1,\min\limits_{v\in P(p,u)}^{}(d_v-h_v))\)。当 \(d_p-r_p \le h(p,u)\) 时 \(f_u\) 得到 \(g_{\text{move}(p,h(p,u)-1)}-g_{fa_{\text{move}(p,d_p-r_p)}}\) 的贡献。其中 \(\text{move}(u,x)\) 为 \(P(u,1)\) 中深度为 \(x\) 的点编号。

拆成两部分做。

\(g_{fa_{\text{move}(p,d_{p}-r_p)}}\) 就相当于 \(l_i=r_i\) 的情况。在得到 \(x = \text{move}(p,d_p-r_p)\) 的信息后枚举 \(p\)。

\(g_{\text{move}(p,h(p,u)-1)}\) 这部分可以考虑放到 \(h(p,u)=d_v - h_v\) 的 \(v\) 这里算。

  1. \(h(p,u) = d_p-l_p+1\)。找到深度最小的 \(u_1\),使得 \(h(p,u) = d_{p} -l_p+1\)。那么枚举 \(p\) 得到 \(u_0\) 后只需要与 \(u_1\) 取深度较大者即可。
  2. \(h(p,u)<d_p-l_p+1\)。考虑 \(i\) 向 \(i\) 祖先中第一个满足 \(d_j -h_j < d_i - h_i\) 的 \(j\) 连边,得到很多棵树。定义 \(cnt_v\) 为放到 \(v\) 这里来算的 \(p\) 的数量。不难发现 \(cnt_v\) 等价于新的树中 \(v\) 子树满足 \(d_p - r_p \le d_v - h_v < d_p - l_p+1\) 的 \(p\) 的数量。由于新树上 \(d-h\) 是单调的,所以也可以对每个 \(p\) 二分找到这样的 \(v\) 所在链。树上差分就可以维护出 \(cnt_v\)。最后还是在得到 \(x\) 的信息后枚举子树中所有 \(d_v - h_v = d_x\) 的 \(v\),让后对 \(u\in P(v, u_0)\) 的 \(f_u\) 增加 \(g_{x}\times cnt_v\)。

整体时间复杂度 \(O(n\log^2 n)\)。

链加单点查不需要树剖。直接 dfn 序加就是 \(O(n\log n)\) 的了。。。

P16435 [APIO 2026 中国赛区] 集宝

记 \(f(u,r)\) 为与 \(u\) 距离不超过 \(r\) 的邻域。

对于暴力,显然就是每次走到 \(y\in f(a_{i+1},d_{i+1})\) 中 \(\text{dis}(x,y)\) 最小的那个点上。时间复杂度 \(O(nq\log n)\)。

发现对于相邻两个 \(f(a_i,d_i),f(a_{i+1},d_{i+1})\) 来说,如果 \(f(a_i,d_i)\cap f(a_{i+1},d_{i+1})\not= \emptyset\),将它们缩成它们的交 \(f(u,c)\) 对答案是没有影响的。

又发现这个合并顺序是没影响的,也就是如果 \(i\) 和 \(i+1\) 合并之后不能再和 \(i+2\) 合并;如果 \(i+1\) 和 \(i+2\) 合并之后不能再和 \(i\) 合并,这两种情况都是正确的。

那么考虑维护这些树上圆。具体地,维护 \(s,t,d,r\) 分别表示路径起点,路径终点,路径长度,经过的树上圆交的半径。

有定义:

  1. 对于一个点 \(u\)。\(s = u,t=u,d=0,r=0\)。
  2. 对于一个 \((a_i,d_i)\)。\(s = a_i, t = a_i, d = 0, r = d_i\)。

合并 \((s_1,t_1,d_1,r_1)\) 和 \((s_2,t_2,d_2,r_2)\) 到 \((s,t,d,r)\):

  1. 二者均为点。\((s,t,d,r) = (u,v,d_1+d_2+\text{dis}(t_1,s_2),0)\)。当 \(d_1 > 0\) 时 \(u = s_1\);当 \(d_1 = 0\) 时 \(u = \text{move}(t_1,s_2,r_1)\)。当 \(d_2 > 0\) 时 \(v = t_2\);当 \(d_2 = 0\) 时 \(v=\text{move}(s_2,t_1,r_2)\)。
  2. 前者是点,后者是圆的交。
    1. \(t_1 \in f(s_2,r_2)\)。\((s,t,d,r) = (s_1,t_1,d_1+d_2,0)\)。
    2. \(t_1\notin f(s_2,r_2)\)。\((s,t,d,r) = (u,v,d_1+d_2+\text{dis}(t_1,s_2)-r_2,0)\)。当 \(d_1 > 0\) 时 \(u = s_1\);当 \(d_1 = 0\) 时 \(u = \text{move}(t_1,s_2,r_1)\)。当 \(d_2 > 0\) 时 \(v = t_2\);当 \(d_2 = 0\) 时 \(v=\text{move}(s_2,t_1,r_2)\)。
  3. 后者是点,前者是圆的交。
    1. \(s_2\in f(t_1,r_1)\)。\((s,t,d,r) = (s_2,t_2,d_1+d_2,0)\)。
    2. \(s_2\notin f(t_1,r_1)\)。\((s,t,d,r) = (u,v,d_1+d_2+\text{dis}(t_1,s_2)-r_1,0)\)。当 \(d_1 > 0\) 时 \(u = s_1\);当 \(d_1 = 0\) 时 \(u = \text{move}(t_1,s_2,r_1)\)。当 \(d_2 > 0\) 时 \(v = t_2\);当 \(d_2 = 0\) 时 \(v=\text{move}(s_2,t_1,r_2)\)。
  4. 二者均为圆的交。
    1. 前者包含后者。\((s,t,d,r) = (s_2,t_2,d_1+d_2,r_2)\)。
    2. 后者包含前者。\((s,t,d,r) = (s_1,t_1,d_1+d_2,r_1)\)。
    3. 二者相交。相交得到的圆的半径为 \(R =\frac{r_1+r_2-\text{dis}(t_1,s_2)}{2}\),圆心为 \(v = \text{move}(t_1,s_2,r_1 -R)\)。有 \((s,t,d,r) = (v,v,d_1+d_2,R)\)。
    4. 二者不相交。可以看作移动到后者时就变成一个点了,因为如果不看作点可能还与后面的圆又有交,此时无法确定位置与距离,但基础暴力就是走到后者邻域中最近点,所以是可行的。\((s,t,d,r) = (u,v,d_1+d_2+\text{dis}(t_1,s_2)-r_1-r_2,0)\)。当 \(d_1 > 0\) 时 \(u = s_1\);当 \(d_1 = 0\) 时 \(u = \text{move}(t_1,s_2,r_1)\)。当 \(d_2 > 0\) 时 \(v = t_2\);当 \(d_2 = 0\) 时 \(v=\text{move}(s_2,t_1,r_2)\)。

既然能合并,就可以直接倍增维护了。时间复杂度 \(O((n+q)\log^2 n)\)。

AT_abc155_f [ABC155F] Perils in Parallel

考虑先差分。那么将区间 \([l,r]\) 异或 \(1\) 等价于将 \(b_{l},b_{r+1}\) 异或 \(1\)。最后要求 \(i\in [1,n]\) 都有 \(b_i = 0\)。

考虑将 \(L_i\) 和 \(R_i+1\) 连边得到无向图 \(G\)。

问题等价于给定每个点的初始状态,问是否能保留 \(G\) 中一些边,使得除了点 \(n+1\) 外其余点状态都为 \(0\)。

对于 \(G\) 每个联通块,跑一棵 DFS 树出来(如果包含 \(n+1\) 就以 \(n+1\) 为根)。显然只有 DFS 树上的边有用。因为如果不考虑非树边,树边保留的状态唯一。

可能需要考虑非树边当且仅当根的状态最后是 \(1\) 且根不是 \(n+1\)。此时如果对一个点 \(u\) 使用非树边,首先使用的数量需要是偶数。不妨设恰好使用了两条,分别是 \((u,v_1),(u,v_2)\)。令 \(dep_{v_1}>dep_{v_2}\),此时 \(v_1\) 到 \(v_2\) 路径边的保留状态都会改变,但 \(v_2\) 到根并不会改变,且 \(v_2\) 的状态也没有改变。所以根本不会影响到根的状态。

那么只要某棵 DFS 树根的状态为 \(1\) 且不是点 \(n+1\) 就无解。否则有解。

时间复杂度 \(O(n+m)\)。

2026.9.10

CF1442E Black, White and Grey Tree

如果没有灰色点。

将同色连通块缩成一个点,得到一棵相邻两个点颜色都不同的树。

这个相当于选择一个点作为根,每次删掉所有叶子。那么操作次数就是到根距离的最大值加 \(1\)。

这个选择直径中点是最优的,记 \(len\) 为直径长度(边数)。那么答案等于 \(\lceil\frac{len}{2}\rceil+1\)。

如果有灰色点。发现灰色点是没有用的,可以直接删去。考虑证明:

如果灰色点有用,说明存在路径 \(u\to v \to w\),使得 \(u,w\) 不是灰色点,\(v\) 是灰色点。且 \(v\) 存在第三条边 \((v,k)\),满足在忽略 \(v\) 后得到的直径经过 \(u\to w\),但实际上 \(v\) 变成的颜色(\(v\) 不对这条直径产生贡献的颜色唯一)让真正的直径经过 \(u\to k\)。

分情况讨论:

  1. \(u,w\) 同色。此时 \(v\) 与 \(u\) 同色。
  2. \(u,k\) 异色。实际上 \(u,v\) 会缩成一个点,\(v\) 不产生额外贡献。
  3. \(u,k\) 同色。\(u,v,k\) 会缩成一个点,\(v\) 不额外产生贡献。
  4. \(u,w\) 异色。此时 \(v\) 可以与 \(u\) 或 \(w\) 同色。
  5. \(u,k\) 异色。当 \(v,k\) 同色时不产生额外贡献。
  6. \(u,k\) 同色。当 \(v,k\) 同色时不产生额外贡献。

所以直径不会从 \(u\to w\) 变成 \(u\to k\)。那么删去 \(v\) 无影响。

并查集维护同色连通块即可。时间复杂度 \(O(n)\)。

CF1712F Triameter

记 \(f(u)\) 为 \(u\) 到最近一个叶子的距离。

考虑对于一个询问二分答案,问题变成判断是否存在一对点 \((u,v)\),使得 \(\text{d}(u,v)\ge mid\)。

显然 \(\text{d}(u,v)=\min(\text{dis}(u,v),f(u)+f(v)+x)\)。

枚举 \(u\),变成判断是否存在 \(v\),使得满足以下条件:

  1. \(f(v)\ge mid - x - f(u)\)。
  2. \(\text{dis}(u,v)\ge mid\)。

先一遍 DFS 预处理 \(f(i)\),并将 \(f(i)\) 从大到小排序。设排序后第 \(i\) 个为点 \(p_i\)。问题变成判断是否存在 \(i\in [1,k]\),使得 \(\text{dis}(p_i,u)\ge mid\)。直接维护直径。

使用 \(O(1)\) 查询的 \(\text{lca}\) 单次 check 就是 \(O(n)\) 的。

整体时间复杂度 \(O(n\log n + nq\log n)\)。

考虑去掉二分。从前往后枚举 \(i\),同时维护当前的 \(ans\)。尝试将 \(ans\) 增加 \(1\)。此时可以用指针维护出满足 \(f(v)\ge (ans+1)-x-f(i)\) 的最大的 \(v\)(因为 \(ans\) 单调不减,\(f(i)\) 单调不增)。这样问题就又变成判断是否存在 \(j\in [1,v]\),使得 \(\text{dis}(p_i,p_j)\ge mid\) 了。

时间复杂度 \(O(n\log n + nq)\)。

AT_arc087_d [ARC087F] Squirrel Migration

注意到让尽可能多的路径经过同一个点是不劣的。

比如要让尽可能多的路径经过 \(u\)。以 \(u\) 为根,若 \(u\) 的两个儿子 \(z_1,z_2\) 子树中存在两对点 \((x_1,y_1),(x_2,y_2)\),满足 \(x_1,y_1\in T(z_1);x_2,y_2\in T(z_2)\),将点对调整为 \((x_1,y_2),(y_1,x_2)\) 不劣。

注意到当 \(u\) 为树的重心时不存在绝对众数,此时一定可以让所有路径都经过 \(u\)。

那么以树的重心为根。将根的每个儿子子树都染色成这个儿子的编号,令根为无色点。

问题变成给定每个点的颜色 \(col_{1\sim n}\),求排列 \(p_{1\sim n}\) 的数量。满足 \(col_{p_i}\ne col_i\) 或 \(col_{p_i}=0\)(只有根的 \(col\) 是 \(0\))。

考虑容斥。设 \(G(k)\) 为钦定 \(k\) 个 \(i\) 满足 \(col_{p_i}=col_i\) 且 \(col_{p_i} \ne 0\) 时的方案数。则答案等于 \(\sum\limits_{k}^{}(-1)^{k}G(k)\)。

定义状态函数 \(f_{i,j}\) 为考虑完前 \(i\) 种颜色,有 \(j\) 个位置被钦定的方案数。记 \(cnt_i\) 为颜色 \(i\) 的数量。转移为:\(f_{i,j+x}\gets f_{i-1,j}\times \binom{cnt_i}{x}\times (cnt_i)^{\underline{x}}\)。

最后 \(G(k) = f_{n,k}\times (n-k)!\)。时间复杂度 \(O(n^2)\)。

P13695 [CEOI 2025] theseus

注意到 \(01\) 状态可以用来描述边的方向。

定义 \((u,v)\) 标记为 \(0\) 表示边 \(u\to v\);标记为 \(1\) 表示边 \(v \to u\)。

以 \(T\) 为根跑 BFS 得到每个点到 \(T\) 的最短路 \(dis_i\)。按照 \(dis\) 从小到大分层。

考虑对于一条边 \((u,v)\):

  1. \(dis_u < dis_{v}\)。标记为 \(1\)。
  2. \(dis_u > dis_v\)。标记为 \(0\)。
  3. \(dis_u = dis_v\)。不太好处理。

如果 \(dis_{u}= dis_{v}\) 的边直接按照 \(u,v\) 大小连,这样可能需要 \(\min + O(n)\) 次查询。

考虑启发式合并。具体的,按照深度从大到小枚举,对于一条边 \((u,v)\):

  1. \(dis_{u}> dis_{v}\)。将 \(u\) 合并到 \(v\) 上面去。标记为 \(0\),并清空 \(u\)。
  2. \(dis_u = dis_v\)。将小的合并到大的上面去,并清空小的。

这样从一个点出发,每次如果都能知道它下一次合并到哪个点,那么:

  1. 向上合并。显然走的最短路。
  2. 向左右合并。因为合并后 \(siz\) 至少翻倍,所以只会出现 \(O(\log n)\) 次。

但我们并不能存下每个点下一次合并到哪。

考虑对于同深度的边,按照 \(u\) 从大到小枚举合并。这样对于一条边 \((u,v)\),如果 \(dis_u = dis_v\),一定有 \(u > v\),且:

  1. \(siz_v = 0\)。说明之前一个更大的 \(u'\) 将 \(v\) 合并了。如果走出边中编号最大的,是会走到 \(u’\) 或一个深度更小的点的。满足要求。
  2. \(siz_v>0\)。说明还没合并。此时 \(u\) 是最大的满足 \(dis_{u}=dis_v\) 的有边的点,走出边中编号最大的要么走到 \(u\) 要么走到深度更小的点。

时间复杂度 \(O(n\log n)\)。

CF1039D You Are Given a Tree

考虑对于一个 \(k\) 怎么做。

贪心地,维护 \(f_{u}\) 表示 \(u\) 会对父亲贡献多少个点。记 \(x,y\) 为儿子 \(f\) 的最大值与次大值,有:

  1. \(x+y+1\ge k\)。\(f_u=0\),答案增加 \(1\)。
  2. \(x+y+1<k\)。\(f_u = x+1\)。

注意到对于情况 \(1\),只会有 \(O(\frac{n}{k})\) 次。那么对于 \(1\le k \le n\),总次数是 \(O(n\log n)\) 的。

这启发我们放一起做。

维护 \(f_{u,k}\) 为当 \(k\) 为这个值时,\(u\) 会对父亲贡献多少个点。记 \(g(u)\) 为 \(u\) 到最深的叶子路径上包含的点数。

不难发现,当 \(k \ge 2g(u)\) 时一定有 \(f_{u,k}=g(u)\)。那么考虑长剖。

对于一个 \(u\):

  1. 继承重儿子信息。

  2. 对于 \(u\) 的轻儿子,维护 \(h_k = (a,b)\) 表示 \(f_k\) 的最大值、次大值。因为是长剖,所以可以暴力求,只有 \(k\in (2g(u),2g'(u)]\) 时 \(h_k = (g'(u)-1,g''(u)-1)\)。其中 \(g'(u)\) 为 \(u\) 到次深的叶子路径上包含的点数,\(g''(u)\) 为第三深。

  3. 更新信息。

    1. 首先对于 \(k\in (2g'(u),1)\) 可以求出重儿子 \(f_{k}\),设 \(h_{k} = (a,b)\)。那么相当于取 \(f_k,a,b\) 的前 \(2\) 大作为 \(x,y\),然后暴力修改 \(f_{k}\)。

    2. 其次对于 \(k\in (2g(u),2g'(u)]\),分两种情况讨论:

      1. \(f_k + a + 1 \ge k\)。相当于找到区间中所有满足 \(k-f_k \le a+1\) 的 \(k\)。线段树维护区间 \(\min\) 即可。
      2. \(a+b+1\ge k\)。有 \(k\in (2g(u),\min(2g'(u),a+b+1)]\)。

      显然,对于一个产生贡献的 \(f_k\),最多会被找到 \(2\) 次,不影响时间复杂度。最后再对 \(k\in (2g(u),2g'(u)]\) 执行 \(f_k\gets \max(f_k,a)+1\) 即可。

那么线段树需要维护:区间查询 \(\min\),区间 chmax,区间加 \(1\),单点修改。

整体时间复杂度 \(O(n\log^2 n)\)。

CF2161F SubMST

枚举 \((u,v)\),考虑边 \((u,v)\) 什么情况下会在最小生成树上。

设子集为 \(S\),首先两个必要条件是:

  1. \(u,v\in S\)。
  2. \(\nexists x\in S, \max(\text{dis}(x,u),\text{dis}(x,v)) < \text{dis}(u,v)\)。

如果直接对这个算会将 \(\max(\text{dis}(x,u),\text{dis}(x,v))=\text{dis}(u,v)\) 的算重,但这个是小问题。

对于条件 \(2\),记 \(f(u,r)\) 为距离 \(u\) 不超过 \(r\) 的邻域,则需要满足 \(x\notin f(u,\text{dis}(u,v))\cap f(v,\text{dis}(u,v))\)。根据树上圆的性质,可知 \(f(u,\text{dis}(u,v))\cap f(v,\text{dis}(u,v))\) 也是一个邻域 \(f(w,r)\)。

先在每条边上加个虚点,令实点为原树上的点。

考虑枚举圆心 \(w\),以 \(w\) 为根。枚举深度 \(r\),按顺序依次加入深度为 \(r\) 的实点。记 \(cnt_r\) 为深度不超过 \(r\) 的实点数量,\(c\) 为在加入当前实点之前已经加入的深度为 \(r\) 的实点数量。则贡献为:\((2^{(c-d)}-1) \times 2^{n-cnt_{r-1}-c-1}\times r\),其中 \(d\) 为与当前实点在 \(w\) 的同一儿子子树且已经加入的实点数量。 这样钦定了 \(\max(\text{dis}(x,u),\text{dis}(x,v))=\text{dis}(u,v)\) 时加入点的顺序,所以不会算重。

P11946 [KTSC 2025] 信竞天择 2 / evolution

因为是知道树的,所以考虑从下往上求解。

那么现在对于一个 \(u\),已知 \(u\) 每个儿子子树内部所有点的相对大小,现在需要合并所有儿子。

相当于现在合并两个大小分别为 \(a,b\) 的有序序列。

考虑两种做法:

  1. 直接归并 \(a,b\)。需要比较 \(|a| + |b| - 1\) 次。
  2. 因为 \(a,b\) 是有序的,所以可以考虑先找到 \(b_{\frac{|b|}{2}}\) 在 \(a\) 中的位置。这样 \([1,\frac{|b|}{2})\) 和 \((\frac{|b|}{2},|b|]\) 就被拆成两部分了。比较次数是 \(O(|b|\log\frac{|a|}{|b|})\) 的。

那么直接做,每次做比较次数小的那个就是对的。

时间复杂度 \(O(n^2)\)。

2026.9.11

CF2154F

没救了,此题不应把 \(p_{1\sim n}\) 转成 \(pos_{1\sim n}\)(每个值的位置),然后求只有最多一对相邻项非增的数量。

考虑枚举 \(k\)。令 \(p_0 = 0,p_{n+1}=n+1\)。

将值 \([0,k]\) 看成黑色,\([k+1,n+1]\) 看成白色。对于相邻两个已知值的位置 \(i,j\)(\(i<j\)):

  1. \(p_i\) 是黑色,\(p_j\) 是黑色。因为值 \([0,k]\) 在排列上的位置是单增的,所以 \([i+1,j-1]\) 包含了 \([p_i+1,p_j-1]\) 所有值。方案数为 \(\binom{(j-1)-(i+1)+1}{(p_j-1)-(p_i+1)+1}\)。
  2. \(p_i\) 是白色,\(p_j\) 是白色。同样方案数为 \(\binom{(j-1)-(i+1)+1}{(p_j-1)-(p_i+1)+1}\)。
  3. \(p_i\) 是黑色,\(p_j\) 是白色。对于下标 \([0,i]\) 来说,因为 \(p_i\) 是里面黑色最大值,所以有 \(p_i+1\) 个黑色和 \((i+1)-(p_i+1)\) 个白色;对于下标 \([0,j]\) 来说,因为 \(p_j\) 是里面白色最大值,所以有 \(p_j-k\) 个白色,\((j+1)-(p_j-k)\) 个黑色。通过差分不难得到,\([i+1,j-1]\) 中有 \((p_j-k)-((i+1)-(p_i+1))-1\) 个白色,\(((j+1)-(p_j-k))-(p_i+1)\) 个黑色。方案数为 \(\binom{(j-1)-(i+1)+1}{((j+1)-(p_j-k))-(p_i+1)}\)。
  4. \(p_i\) 是白色,\(p_j\) 是黑色。对于下标 \([0,i]\) 来说,因为 \(p_i\) 是里面白色最大值,所以有 \(p_i-k\) 个白色和 \((i+1)-(p_i-k)\) 个黑色;对于下标 \([0,j]\) 来说,因为 \(p_j\) 是里面黑色最大值,所以有 \(p_j+1\) 个黑色,\((j+1)-(p_j+1)\) 个白色。通过差分不难得到,\([i+1,j-1]\) 中有 \(((j+1)-(p_j+1))-(p_i-k)\) 个白色,\((p_j+1)-((i+1)-(p_i-k))-1\) 个黑色。方案数为 \(\binom{(j-1)-(i+1)+1}{((j+1)-(p_j+1))-(p_i-k)}\)。

整合一下:

  1. \(p_i,p_j\) 同色。方案数为 \(\binom{j-i-1}{p_j-p_i-1}\)。
  2. \(p_i,p_j\) 异色。方案数为 \(\binom{j-i-1}{j-p_i-p_j+k}\)。

维护 \(f_k\) 为 \(k\) 固定时这些组合数的乘积。

如果 \(p_i,p_j\) 异色且合法,需要满足:

  1. 记 \(x=\min(p_i,p_j),y=\max(p_i,p_j)\)。则 \(\max(x,x+y-j) \le k <\min(y, x+y-i)\)。

发现 \(\min(y, x+y-i) - \max(x,x+y-j) \le j-i\)。那么暴力枚举 \(k\),并将 \(f_k\) 乘上 \(\binom{j-i-1}{j-p_i-p_j+k}\) 均摊就是 \(O(n)\) 的,还需要维护一个 \(g_k\) 表示 \(k\) 被多少个相邻项贡献了组合数(因为 \(\binom{j-i-1}{j-p_i-p_j+k}=0\) 的没有枚举)。

如果 \(p_i,p_j\) 同色且合法,需要满足:

  1. \(p_i<p_j\)。

  2. \(p_j \le k\) 或 \(p_{i} > k\)。

维护前缀、后缀乘某个数即可。也是 \(O(n)\) 的。

那么整体时间复杂度 \(O(n)\)。同时如果 \(p = [1,n]\) 是合法的,需要将答案减去 \(n-2\)。

CF819D Mister B and Astronomers

做一个前缀和,记为 \(s_{1\sim n}\)。那么第 \(k\) 轮 \(i\) 的观测时间就是 \((k-1)s_n + s_i - s_1\)。

那么考虑 \(i\) 向 \((i+s_n)\bmod T\) 连边。初始在 \((s_i -s_1)\bmod T\) 放上 \(i\),并标记这个点。那么 \(i\) 的答案就是不断走,直到遇到一个被标记的点为止时,走的步数。

显然会得到 \(\gcd(s_n,T)\) 个环,以 \(i\) 为第 \(i+1\) 个环的代表元。那么 \((s_i-s_1)\bmod T\) 属于第 \((s_i - s_1)\bmod \gcd(s_n,T) + 1\) 个环。

对于第 \(i+1\) 个环上一个点 \(x\),\(i\) 到它的距离满足 \(i + ks_n \equiv x\pmod T\)。相当于 \(ks_n + yT = (x-i)\)。找到一组非负解 \((k_0,y_0)\) 使得 \(k_0s_n + y_0T = \gcd(s_n,T)\)。通解为 \(k_1 = k_0 + x\times \frac{T}{\gcd(s_n,T)},y_1 = y_0 - x\times \frac{s_n}{\gcd(s_n,T)}\)。那么 \(k = (k_0 \times \frac{x-i}{\gcd(s_n,T)})\bmod (\frac{T}{\gcd(s_n,T)})\)。

最后按照距离排序就可以求出每个点后面第一个被标记的点了。

时间复杂度 \(O(n\log V)\)。

CF1582G Kuzya and Homework

分解质因数。对每个 \(l\) 维护这个质因数下最大的 \(r\),使得 \([l,r]\) 中不存在某个时刻这个质因数次数小于 \(0\)。做一个前缀和之后相当于对每个 \(i\) 找到后面第一个 \(j\),使得 \(s_j - s_{i-1} < 0\)。单调栈找就行了。对于没有这个质因子的点,是若干次区间取 \(\min\)。线段树维护即可。

时间复杂度 \(O(n\log V\log n + n\log V)\)。

CF1427E Xum

考虑每次消去最高位。设 \(x = 1[y]1\)。操作:

\[x= 0000001[y]1\\ a= 0001[y]1[0]0\\ b = 0001[y]0[y]1\\ c = 001[y]01[y]1\\ d = 0000011[y]1\\ e = 0000010[0]0\\ f =0000001[0]0 \]

其中 \(e\) 到 \(f\) 是通过不断将 \(e\) 乘 \(2\),并将 \(a\) 中为 \(1\) 的位置减去得到的。

最后剩下 \(1\) 就停止。

2026.9.14

P7563 [JOISC 2021] 最悪の記者 4 (Worst Reporter 4) (Day4)

\(i\) 向 \(a_i\) 连边得到内向基环树森林。

对于非环上点,要求点权不小于父亲点权;对于环上点,要求点权相同。

注意到当确定了点权不变的点时,剩下的点一定可以满足条件。那么定义状态函数 \(f_{u}\) 为当 \(u\) 点权不变时,\(u\) 子树节省代价的最大值。有:

  • \(f_u = c_u + \sum\limits_{v\in son_u}^{}\max(f_{v}[h_v\ge h_u],g_{v,h_u})\)。
  • \(g_{u,x}=\sum\limits_{v\in son_u}^{}\max(f_{v}[h_v\ge x],\max\limits_{y\ge x}^{}g_{v,y})\)。

其中 \(g_{u,x}\) 表示选择 \(u\) 子树中若干个不交的子树,使得每个选择子树的根都被保留且点权不小于 \(x\)。

直接线段树合并即可。需要维护:单点修改,合并,后缀 \(\max\)。

对于一棵基环树,记环上点为 \(p_1,p_2,\dots,p_k\),\(sum\) 为基环树所有点 \(c\) 的和。分情况讨论:

  1. 环上的点都不保留。答案为 \(sum - \sum\limits_{i=1}^{k}\sum\limits_{v\in son_{p_i}}^{}\max\limits_{x}^{}g_{v,x}\)。
  2. 有环上的点要保留。答案为 \(sum - \max\limits_{x}^{}(\sum\limits_{i=1}^{k}\max(f_{p_i}[h_{p_i}=x],\sum\limits_{v\in son_{p_i}}^{}\max\limits_{y\ge x}^{}g_{v,y}))\)。

线段树合并时间复杂度 \(O(n\log n)\)。

P10013 [集训队互测 2023] Tree Topological Order Counting

对于 \(u\) 计算答案,只需要满足 \(u\) 子树中的点都在 \(fa_u\) 之后就行了。

那么定义状态函数 \(f_{u,i}\) 为只考虑 \(u\) 子树外的点(包括 \(u\))且 \(u\) 的相对大小为 \(i\) 时的方案数。

记 \(g_u = siz_u!\prod\limits_{v\in T(u)}^{}\frac{1}{siz_v}\)。那么有:

  • \(ans_u = \sum\limits_{x = 1}^{n}b_{x} \times f_{u,x}\times \binom{n-x}{siz_u-1}\times g_u\)。

对于转移,有:

  • \(f_{u,i} = \sum\limits_{j<i}^{}f_{fa_u,j}\times (\prod\limits_{v\in son_{fa_u}\land v\ne u}^{}g_v)\times ((n-j-siz_u)! \prod\limits_{v\in son_{fa_u}\land v\ne u}^{}\frac{1}{siz_v!}\times \frac{1}{(n-siz_{fa_u}+1-j)!})\)。

时间复杂度 \(O(n^2)\)。

QOJ9700 英杯

定义状态函数 \(f_{u,x,y,0/1}\) 为 \(u\) 子树,有 \(x\) 个点是局部最小值,且 \(a_{fa_u}\) 比 \(u\) 小或大,\(a_u\) 的相对大小为 \(y\) 的方案数。

维护一个 \(g_{i,x,y,1/0}\) 表示考虑完前 \(i\) 个儿子,一共有 \(x\) 个局部最小值,相对大小为 \(y\) 且 \(u\) 是否比前面的儿子都小的方案数。

设当前儿子为 \(v\),则:

\[g_{i,x+x',y+c,0}\gets g_{i-1,x,y,0}\times f_{v,x',y',[y'\le c]}\times \binom{y-1+c}{c}\times \binom{siz-y+siz_v-c}{siz_v-c}\\ g_{i,x+x',y+c,0}\gets g_{i-1,x,y,1}\times f_{v,x',y',1}\times \binom{y-1+c}{c}\times \binom{siz-y+siz_v-c}{siz_v-c}[y'\le c]\\ g_{i,x+x',y+c,1}\gets g_{i-1,x,y,1}\times f_{v,x',y',0}\times \binom{y-1+c}{c}\times\binom{siz-y+siz_v-c}{siz_v-c}[y'>c] \]

其中 \(siz\) 为前 \(i\) 个儿子子树大小和加 \(1\)。初始化 \(g_{0,0,1,1}=1\)。

再对 \(u\) 是否是局部最小值分类讨论:

  1. \(u\) 不是局部最小值。\(f_{u,x,y,1}\gets g_{|son_u|,x,y,0},f_{u,x,y,0}\gets g_{|son_u|,x,y,0/1}\)。
  2. \(u\) 是局部最小值。\(f_{u,x+1,y,1}\gets g_{|son_u|,x,y,1}\)。

特别的,当 \(u\) 是根时,有:

  1. \(ans_{x}\gets g_{|son_u|,x,y,0}\)。
  2. \(ans_{x+1}\gets g_{|son_u|,x,y,1}\)。

直接做时间复杂度 \(O(n^4)\)。

直接卷做到 \(O(n^3\log n)\)。

P10064 [SNOI2024] 公交线路

考虑判定一个集合 \(S\) 合不合法。

对于一个叶子 \(x\),记 \(T_x\) 为与 \(x\) 有边的点集合。则应该满足 \(\bigcap\limits_{x \text{ is leaf}}^{}T_x \not= \emptyset\)。

相当于形成一个连通块。点减边容斥,有:

  1. 对于一个点 \(u\)。如果对所有叶子 \(x\) 均满足:\(S\) 中存在同时经过 \(x,u\) 的路径 \(P\)。则贡献 \(1\)。
  2. 对于一条边 \((u,v)\)。如果对所有叶子 \(x\) 均满足:\(S\) 中存在同时经过 \(x,u,v\) 的路径 \(P\)。则贡献 \(-1\)。

答案即为所有贡献之和。

先做点的贡献。

路径两端都是叶子不太好做,考虑容斥。设 \(G(u,x)\) 为钦定 \(x\) 个叶子在 \(S\) 中不存在同时经过 \(x,u\) 的路径 \(P\) 的方案数。则合法方案数为 \(\sum\limits_{x}(-1)^xG(u,x)\)。

叶子被分进若干个子树和 \(u\) 子树外。钦定子树外的叶子一定经过 \(u\),对子树内的容斥。设 \(v_i\) 为 \(u\) 的第 \(i\) 个儿子,\(leaf_x\) 为 \(x\) 子树叶子数量,\(siz_x\) 为子树大小。定义状态函数 \(f_{i,j}\) 为考虑完前 \(i\) 个儿子子树,钦定 \(j\) 个叶子不经过 \(u\) 的方案数。有:

  • \(f_{i,j+j'}\gets f_{i-1,j}\binom{leaf_{v_i}}{j} 2^{(\sum\limits_{k\le i}^{}siz_{v_{k}} - j)(siz_{v_i}-j)}\)。

那么 \(u\) 的贡献为 \(2^{\binom{n-siz_u}{2}+\sum\limits_{v\in son_u}^{}\binom{siz_v}{2}}\sum\limits_{x}^{}(-1)^x f_{|son_u|,x}2^{(siz_u-x)((n-siz_u)-(leaf-leaf_u))}(2^{siz_u-x}-1)^{leaf-leaf_u}\)。

时间复杂度 \(O(n^2)\)。

再做边的贡献。

枚举边 \((u,fa_u)\)。还是钦定子树内有 \(x\) 个点不经过这条边。

贡献为 \(-2^{\binom{siz_u}{2}+\binom{n-siz_u}{2}}\sum\limits_{x}(-1)^x \binom{leaf_u}{x}2^{(siz_u-x)((n-siz_u)-(leaf-leaf_u))}(2^{siz_u-x}-1)^{leaf-leaf_u}\)。

时间复杂度 \(O(n^2)\)。

CF1658F Juju and Binary String

设原串有 \(cnt\) 个 \(1\),拼接的串有 \(c\) 个 \(1\)。那么 \(\frac{cnt}{n}=\frac{c}{m}\)。即 \(c = \frac{m\times cnt}{n}\)。

把这个串首尾相连,滑动长度为 \(m\) 的区间。每次删去一个字符加入一个字符,则 \(\Delta c \in \{-1,0,1\}\)。那么如果中途存在 \(c<\frac{m\times cnt}{n}\) 与 \(c > \frac{m\times cnt}{n}\) 一定存在 \(c = \frac{m\times cnt}{n}\)。如果不存在,说明所有 \(c < \frac{m\times cnt}{n}\) 或 \(c>\frac{m\times cnt}{n}\)。将 \(i\in [1,n]\) 的 \([i,i+m-1]\) 中 \(1\) 的数量求和,有 \(\sum c < m\times cnt\) 或 \(c > m\times cnt\)。而每个位置恰好被算 \(m\) 次,所以有 \(\sum [s_i=1] < cnt\) 或 \(\sum [s_i=1]>cnt\)。与定义矛盾。

那么答案不超过 \(2\)(可能是一段前缀拼一段后缀),扫的时候一定能得到答案。时间复杂度 \(O(n)\)。

2026.9.15

P8179 「EZEC-11」Tyres

定义状态函数 \(f_{i,j}\) 为用前 \(i\) 套轮胎跑了 \(j\) 圈的最小代价。有:

  • \(f_{i,j} = \min(f_{i-1,j},\min\limits_{k=1}^{j}f_{i-1,j-k}+\sum\limits_{x=1}^{k}(a_i+b_i(x-1)^2)+t)\)。

初始化 \(f_{0,0}=-t\),以保证第一套不花时间。

把 \(t\) 放到每套轮胎的第 \(1\) 圈来算。

注意到当 \(b_i(x_0-1)^2 \ge t\) 时可以把 \(1 \le x \le x_0\) 与 \(x_0 < x \le m\) 分开算。因为最优解下不可能选择了 \((x_0+m]\) 中一段 \(x\) 而没有选完 \([1,x_0]\)(\([1,x_0]\) 每个都不比 \((x_0,m]\) 中的大)。

令 \(x_0 = \lceil\sqrt{t}\rceil + 1\)。对每套轮胎的前 \(x_0\) 圈暴力跑 DP,对每套轮胎剩下的圈跑贪心(显然每次选代价最小的)。记 \(f(i)\) 为前者共 \(i\) 圈的最小代价,\(g(i)\) 为后者共 \(j\) 圈的最小代价。那么答案为 \(\min\limits_{x=1}^{m}f(x)+g(m-x)-t\)。

DP 的时间复杂度 \(O(n^2t)\)。贪心的时间复杂度 \(O(m\log n)\)。

AT_agc052_b [AGC052B] Tree Edges XOR

以某个点 \(u\) 为根,记 \(w_x\) 为 \(u\) 到 \(x\) 路径上 \(w_{i,1}\) 的异或和。

发现一次操作 \((x,y)\)(\(x\) 是 \(y\) 父亲)等价于交换 \(w_{x}\) 与 \(w_y\)。

那么只要 \(\{w_x\} = \{w_{i,2}\}\) 就有解。

先以 \(1\) 为根得到每个点到 \(1\) 路径上 \(w_{i,1}\) 的异或和 \(d_x\)。那么以 \(u\) 为根时 \(w_{v} = d_u\oplus d_v\)。若 \(\{w_x\}=\{w_{i,2}\}\),则 \(\bigoplus \limits_{i=1}^{n}d_i \oplus d_{u}=\bigoplus d_{2,i}\oplus d_{2,u}\)。可以解出唯一的 \(d_u\oplus d_{2,u} = (\bigoplus w_{i,2}) \oplus (\bigoplus d_i)\)。

最后判断是否存在这样的 \(u\) 即可。时间复杂度 \(O(n)\)。

P3734 [HAOI2017] 方案数

定义状态函数 \(f(x,y,z)\) 为这三维分别有 \(x,y,z\) 个 \(1\) 的方案数。将障碍与终点放一起,以第一维、第二维、第三维的优先级从小到大排序。定义 \(g_i\) 为从 \((0,0,0)\) 走到第 \(i\) 个点,且不经过前面任意一个点的方案数。设第 \(i\) 个点为 \((x_i,y_i,z_i)\)。

有:\(g_i = f(|x_i|,|y_i|,|z_i|) - \sum\limits_{j=1}^{i-1}g_j f(|x_i-x_j|,|y_i-y_j|,|z_i-z_j|)[(x_j,y_j,z_j)\subseteq (x_i,y_i,z_i)]\)。

对于 \(f(x,y,z)\),有:\(f(x,y,z)=\sum\limits_{x'=0}^{x-1}f(x',y,z)\binom{x}{x'}+\sum\limits_{y'=0}^{y-1}f(x,y',z)\binom{y}{y'}+\sum\limits_{z'=0}^{z-1}f(x,y,z')\binom{z}{z'}\)。

时间复杂度 \(O(o^2 + o\log o + (\log V)^4)\)。

posted @ 2026-09-03 08:44  harmis_yz  阅读(35)  评论(0)    收藏  举报