2024“钉耙编程”中国大学生算法设计超级联赛(3)

2024“钉耙编程”中国大学生算法设计超级联赛(3)

HDU 逆天系统,赛时显示的不是过题队伍数量而是 AC 数。有个队最后 1h 狂交 1003。

Code Repo

Problems AC
7457 深度自同构 ○
7458 旅行 ⊕
7459 游走 待补
7460 游戏
7461 数论
7462 字符串
7463 单峰数列 ○
7464 比特跳跃 ○
7465 圣芙蕾雅
7466 绘世之卷
7467 抓拍 ○
7468 死亡之组 ○

1001 深度自同构 DP

对于由若干有根树构成的森林,定义该森林是深度自同构的,当且仅当森林中任意两个深度相同的节点都有相同的度。

请计数有多少个深度自同构的无编号有根树森林,使得其恰好由 n 个节点构成,答案对 998244353 取模。

我们先考虑 由 n 个节点的合法的树的个数。转化一下条件,任意深度相同的节点有相同的度数,这其实意味着深度相同节点的子树形态是完全一样的。(度数其实是对树的形态的限制)

这个东西是可以递推的,令 $f_i$ 表示有 i 个点的合法的树的个数。拿出一个点作为根节点,剩下 $n - 1$ 个点我们枚举因数转移 $f_i=\sum_{d \mid(i-1)} f_d$。

那么对于森林的个数,其实就类似了,只不过不用多拿出一个点来作为根节点。$ans_i=\sum_{d \mid i} f_d$

1002 旅行 线段树合并

本题要求树上一些不相交的链使得权值和最大,每个链要求起始点和 终止点颜色相同,权值为起点和终点的权值和。

第一场刚学了个树上的 DSU on Tree / 线段树合并 这类的问题,赛时尝试过往这方面去想,还是不会,正好多学学。

先来波感性理解,假如我们在树上 DP,我们在 LCA 处枚举经过这个点的链。如果这个点不被经过的话,就是把所有孩子节点的 dp 值加起来;如果被 (u, v) 经过的话,我们就要 (u, v) 的贡献以及 u 下面子树的贡献,v 下面子树的贡献,和这条链上其他点的其他孩子的 dp 值。

那么我们令 颜色 作为线段树的下标,维护 dp 值的 max。

dp[u][0] 存不经过的值,dp[u][1] 则是算上了经过的值

先遍历一遍子树,算出 dp[u][0]。然后遍历儿子,把每个儿子的线段树减去 dp[v][1] 后 merge,在 merge 的时候,如果递归到了叶子节点,就维护 dp[u][1]。

1007 单峰数列 线段树

典题。可以直接线段树大力维护。事实上,维护差分数组可以更简单。

1008 比特跳跃 建图

给你一张图 和 k。点 x 可以花 k * (x or y) 的代价跳到点 y。求点 1 到各个点的最短路。

1011 抓拍 三分

原题,弱化版。

1012 死亡之组

签到。

2024“钉耙编程”中国大学生算法设计超级联赛(3)

https://tosakaucw.github.io/2024“钉耙编程”中国大学生算法设计超级联赛(3)/

Author

TosakaUCW

Posted on

2024-07-26

Updated on

2024-07-28

Licensed under

Comments