做题记录 26.2.18

\(\textcolor{black}\odot\) P10198 [USACO24FEB] Infinite Adventure P

\(a\) 表示题目中的 \(T\)

对于每个 \(1\le u\le n\)\(0\le x<a_u\)\(i\ge 0\),令 \(f_{u,x,i}\) 表示从 \(u\) 出发,初始时间为 \(x\),经过 \(2^i\)\(=a_u\)\(a\) 后所到的点或在 \(>a_u\) 的点停止,\(g_{u,x,i}\) 表示其步数

\(S=\sum a_i\)\(V=\max(\max t,\max \Delta)\),容易 \(O(S\log V)\) 预处理 \(f\)\(g\)

查询 \((u,t,\Delta)\) 时,不断倍增,\(O(\log S)\) 轮倍增后 \(a\) 达到最大值,之后减少,总计 \(O(\log S)\) 轮倍增,每轮 \(O(\log V)\)

总时间复杂度 \(O(S\log V+q\log S\log V)\)

代码

参考

\(\textcolor{black}\odot\) AT_agc029_f [AGC029F] Construction of a tree

一个必要条件为任意 \(S\subseteq [1,n-1]\)\(|\bigcup_{i\in S} E_i|\ge |S|+1\)

通过构造证明这是充分的

每个 \(E_i\) 建一个右部点,每个结点建立一个左部点,若 \(u\in E_i\)\(L(u)\)\(R(i)\) 连边,建立二分图

根据 \(\text{Hall}\) 定理,此时必然存在右部点的完美匹配,求出任意一组,则左部点中恰好存在一个点没有匹配,设这个点为 \(r\)

任选一个与之相连的还没有选过的右部点 \(u\),选择与之匹配的左部点 \(w\)\(E_u\)\(r\)\(w\),然后对 \(w\) 递归处理

原命题成立相当于对于任意满足条件的图,以上过程都可遍历整张图

若无法遍历整张图,则某时刻走过的左部点比右部点多 \(1\),从而对于未遍历过的右部点集合 \(S\)\(|S|\ge |\bigcup_{i\in S}E_i|\),与条件矛盾

以上过程容易做到 \(O(m\sqrt n)\),其中 \(m=\sum_i |E_i|\)

代码

参考

\(\textcolor{black}\odot\) AT_agc065_f [AGC065F] Always Perfect

先考虑如何判定一张给定的图是否合法

建立圆方树,考虑一个点双 \(S\),对于 \(u\in S\),定义 \(D(u)\) 为圆方树上去掉 \(S\) 对应方点后 \(u\) 所在连通块的圆点数量

定理 \(1\):对于合法图中任意点双 \(S\),所有 \(u\in S\)\(D(u)\bmod 2\) 相同

证明:

  • 若存在点双使得其中两点的 \(D(u)\bmod 2\) 不同,显然可以从点双中找出两相邻点 \(u,v\) 使得 \(D(u)\bmod 2=0,D(v)\bmod 2=1\)
  • 以此点双对应方点为根,则完美匹配中,子树 \(u\) 内点必然不与子树外点匹配
  • 构造生成树,\(v\) 只保留与 \(u\) 相连的边,显然必然存在这样的一棵生成树
  • 此时 \(u\)\(v\) 必然匹配,导致子树 \(u\) 内无法匹配,从而不合法

若一个点双中 \(D(u)\bmod 2\) 都是 \(0\),则此点双内的边必然不在完美匹配中

若一个点双中 \(D(u)\bmod 2\) 都是 \(1\),则要求点双任意生成树都有完美匹配

可证点双合法当且仅当任意点度数 \(\le 2\),即简单环,或只有两个点,称这样的点双为生成元

因此合法的图可以通过以下方式生成:取若干生成元,每次选择若干连通块,每个连通块中选择一点,将选出的点连成一个点双,直到整张图连通

考虑如何计数

\(g_n\) 表示 \(n\) 点的有标号连通图数量,显然

\[g_i=2^{\binom i2}-\sum_{j=1}^{i-1} \binom{i-1}{j-1}2^{\binom{i-j}2} g_j \]

容易做到 \(O(n^2)\)

\(f_{i,j}\) 表示 \(i\) 个点且有 \(j\) 个点双的有标号连通图数量,显然 \(f_{i,1}=g_i-\sum_{j>1} f_{i,j}\),考虑对于 \(j>1\) 计算 \(f_{i,j}\)

考虑建立圆方树,令 \(1\) 为根,则有 \(j\) 个方点,设它们的儿子数量分别为 \(a_{1\sim j}\),则 \(\sum a=i-1\)

将方点和其所有儿子视为一个部分,\(1\) 单独一个部分,一共 \(j+1\) 个部分,连成树状结构,用 \(\text{Pr\"ufer}\) 序列计数得形成有根树的方案为 \(i^{j-1}\),每个连通块的贡献为 \(f_{a_k+1,1}\),对除 \(1\)\(i-1\) 个点重编号方案数为 \(\binom{i-1}{a_1,a_2,\cdots,a_j}\),从而

\[f_{i,j}= i^{j-1}\sum_{a_{1\sim j}\mid \sum a=i-1} \binom{i-1}{a_1,a_2,\cdots,a_j} \prod_{k=1}^j f_{a_k+1,1} \]

容易背包得到,这部分时间复杂度 \(O(n^3)\)

考虑统计答案,同样建立圆方树,选择方点的一个独立集,剩余点双缩为一个点,则形式与求 \(f\) 类似

总时间复杂度 \(O(n^3)\)

代码

参考

posted @ 2026-02-19 07:36  Hstry  阅读(2)  评论(0)    收藏  举报