Loading

[CF 1906J] Count BFS Graph

前言

注意到这个题没想到点子上, 于是进行记录

思路

分析题目 + 基本性质

不难想到借用 \(\rm{bfs}\) 树来解决
于是深度分析 \(\rm{bfs}\) 树的性质

首先是原图中究竟哪些边影响了 \(\rm{bfs}\)
不难发现对于点 \(u\), 对于其 \(\rm{bfs}\) 树上的父亲 \(v\), 对于 \(\rm{bfs}\) 序上 \(v\) 之前的点, \(u\) 都不能和其相连

其次就是对于点 \(u\), 它的儿子有什么性质
不难观察到其儿子们一定是一个 \(\rm{bfs}\) 序上的连续段, 但是还有一个重要性质, 即这些儿子的编号应当是递增的

因此问题转化为求所有合法的 \(\rm{bfs}\) 树, 并要求在过程中维护方案数

转化用于做题

不难发现维护点 \(u\) 时, 我们应该需要知道其 \(\rm{bfs}\) 树上的父亲 \(p\)\(\rm{bfs}\)
于是设计 \(f_{u, p}\) 表示当前维护到了点 \(u\), 其 \(\rm{bfs}\) 树上的父亲为 \(p\) 的方案数
怎么转移?

不难发现 \(f_{u, p}\) 应当由其 \(\rm{bfs}\) 序上的前一个转移而来, 记为 \(v\)
但是 \(v\)\(u\) 不一定是一个父亲, 如果 \(A_u \geq A_v\), 那么是可以并入一个父亲 \(p\) 的, 否则只能是 \(p\) 的前一个位置 \(p'\)

然后就出意外了

「否则只能是 $p$ 的前一个位置 $p'$」 是否正确

显然是不正确的, 例如这种情况
pErSIRH.png

也就是说, 只要 pp'pp 是同段的, 就行

正确转移

这样我们可以写出一个转移

\[f_{i + 1, k} \gets \sum_{k \in [j, nxt_j+1]} ​2^{j−i−1} \times f_{i, j} \]

不难发现前缀和可以优化到 \(\mathcal{O}(n^2)\)
具体不是这个式子, 但是就是这么个意思

总结

拿几个维度表示状态的 \(\rm{dp}\), 往往根据需要的信息设计状态

posted @ 2025-03-27 18:47  Yorg  阅读(20)  评论(0)    收藏  举报