【题解】2025 蓝桥杯国赛 CA

本文最后更新于:2025年6月21日 凌晨

E. 树

\(dp[x][0/1/2]\) 表示在以 \(x\) 为根的子树中,不同选取情况对应的方案数。

  • \(dp[x][0]\):节点 \(x\) 被选中。
  • \(dp[x][1]\):节点 \(x\) 未被选中,但其恰好一个儿子被选中。
  • \(dp[x][2]\):节点 \(x\) 未被选中,且其所有儿子也未被选中。

转移如下

\[ \large dp[x][0]=\prod_{y\in son[x]}dp[y][2] \]

\[ \large dp[x][1]=\sum_{y\in son[x]}\left(dp[y][0]\prod_{z\in son[x],z\neq y}\left(dp[z][1]+dp[z][2]\right)\right) \]

\[ \large dp[x][2]=\prod_{y\in son[x]}(dp[y][1]+dp[y][2]) \]

答案是 \(dp[1][0]+dp[1][1]+dp[1][2]-1\),减一是为了减去空集。

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


F. 连锁反应

暴力做法就是对于两个炸弹 \(x, y\),如果 \(x\) 炸了能顺带把 \(y\) 炸了,就连一条 \(x\to y\)

将这张图缩点,得到一个 DAG,此时只用数有多少个点入度为 \(0\) 即可(我们可以从这些点开始引爆)。

注意到对于每个炸弹,能被它连锁引爆的炸弹形成一个区间,我们可以二分找到这个区间,从该点向这个区间连边,也就是线段树优化建图。具体的,从这个炸弹对应的叶节点向线段树上被这个区间包含的 \(O(\log n)\) 个节点连边。

问题就在,线段树结构边的存在,使得缩点后我们不能单纯地找入度为 \(0\) 的点了。

但我们仍然可以构建出炸弹的传递链:从所有包含炸弹的 SCC 出发 BFS,标记可达的点。而没被这些点指向的包含炸弹的 SCC,就是一个可行的引爆点。

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


G. 翻转硬币

下标按\(\bmod \text{LCM}(1,2,3)=6\) 分组,每组建一棵线段树。

第一种操作要么对\(\bmod 0,2,4\) 对应的三棵线段树操作,要么对\(\bmod 1, 3, 5\) 对应的三棵线段树操作。

第二种操作,同理每次对两棵线段树操作。

第三种操作,对所有线段树操作。

对于每一棵线段树,维护懒标记 \(\text{rev}\) 表示是否翻转,再维护一个区间和即可。

容易错的地方是怎么把区间 \([l,r]\) 映射到某棵线段树上对应的区间 \([L,R]\) 找到,比较稳妥的方式是二分。

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


H. 斐波那契数列

纸上展开几项易得: \[ \large G_n=G_1^{F_{n-2}}G_2^{F_{n-1}}(n\ge 3) \]\(H_n=\prod\limits_{i=1}^{n}G_i\)\(S_n=\sum\limits_{i=1}^{n}F_i\),纸上画一下也有 \[ \large H_n=G_1^{S_{n-2}+1}G_2^{S_{n-1}}(n\ge 3) \] 斐波那契数列有性质 \[ \large S_n=F_{n+2}-1 \]\(G_1=2,G_2=3\) 一起代入,得 \[ \large H_n=2^{F_n}\cdot3^{F_{n+1}-1} \]\(p=998244353\),由欧拉定理,我们相当于求 \[ \large 2^{F_n\bmod (p-1)}\cdot 3^{F_{n+1}-1\bmod (p-1)}\bmod p \] 至于求 \(F_n\),用一个经典的递推 \[ \begin{pmatrix} F_n \\ F_{n-1} \end{pmatrix} = \begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix} \begin{pmatrix} F_{n-1} \\ F_{n-2} \end{pmatrix} \] 也就是 \[ \begin{pmatrix} F_n \\ F_{n-1} \end{pmatrix} = \begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix}^{n-2} \begin{pmatrix} F_{2} \\ F_{1} \end{pmatrix} \]\(\bmod (p-1)\) 下矩阵快速幂即可。

时间复杂度 \(O(2^3\log n+\log p)\)


I. 游戏

结论:答案至多为 \(2\)

考虑如下构造:

  • 先连一条 \((n-2,n)\),此时你可以将位于 \(n-1\)\(n-2\) 上的数进行交换。
  • 再连一条 \((1,n)\),这样你就可以循环位移了。

那能循环位移,你每次就可以把要交换的两个相邻的数移到最后进行交换。

也就是说,你可以自由交换相邻的数了,也就一定能排序,得证。

接下来考虑什么时候答案为 \(0\)\(1\)

  • 一开始就排好序就是 \(0\)
  • 若能通过至多一次区间循环位移排好序就是 \(1\)
  • 否则就是 \(2\)

J. 公路

拆贡献。枚举每一种颜色(即边权),把和该颜色相同的边全部拆掉,整棵树被拆分为若干连通块,设每个连通块的点数分别为 \(T_1,T_2,\ldots,T_m\)。那么,这种颜色的贡献就是: \[ n(n-1)-\sum_{i=1}^{m}T_i(T_i-1) \] 最终的答案就是每种颜色的贡献之和。

选定任意一个点为根,一个朴素的想法是对每种颜色建出虚树(取对应颜色的边下面的点,以及根节点),这确实是可行的。

\(sz[x]\) 表示以 \(x\) 为根的子树大小,称虚树上在我们选取的点集中的点称为黑点(特别的,包括根节点),其它点称为白点。

那么我们可以对每个黑点 \(x\) 算出它所在的连通块的大小,即 \[ sz[x]-\sum_{y,\ y\text{ 是 } x \text{ 子树中的黑点 }, \text{ 且 } x\to y \text{ 的路径上没有其它黑点}} sz[y] \] 具体的,如果 \(y\) 上面的点是白点,就可以把 \(sz[y]\) 传递上去。

时间复杂度 \(O(n\log n)\),但实际 T 了,跑了 1.1s。

下面的代码经过刻意卡常,洛谷上跑了 820ms。


【题解】2025 蓝桥杯国赛 CA
https://kisuraop.github.io/posts/c80723a0.html
作者
KisuraOP
发布于
2025年6月17日
许可协议