【2023.07.18】“钉耙编程”中国大学生算法设计超级联赛Day1过题小记
1009 - Assertion(模拟、数学)
9分钟过题。打卡题,鸽巢原理,不懂也能做。
1005 - Cyclically Isomorphic(字符串)
26分钟过题。打卡题,比较典,用KMP过的。也有字符串哈希、后缀数组等过法。
1002 - City Upgrading(树、dp-树形dp)
1小时22分钟过题。树形dp,队友做的。
1012 - Play on Tree(树、dp-换根dp、概率论-树上删边游戏)
3小时14分钟过题。题目表述不清,一开始以为暴力枚举、只要有赢的走法即认定为赢,不用深度博弈、答案有限。结果看了提问区才知道双方仍然采取最优策略。
于是,固定根节点,问题转变为树上删边游戏(模板链接 ),可以使用SG函数解决;随后使用换根dp转移到不定根节点,个人感觉这题难度较高,然而过题人数惊人,竟差点成人均算法!
1001 - Hide-And-Seek Game(树、暴力、数论-扩展欧几里得)
题意:给定一棵 \(n\ (1\le n\le 3\cdot 10^3)\) 个节点的树。
接下来为 \(m\ (1\le m\le 3\cdot 10^3)\) 次询问,每一次询问如下:有一个人 \(A\) 会在 \(S_a\) 到 \(T_a\ (S_a\neq T_a)\) 的路径上来回走动、另有一人 \(B\) 会在 \(S_b\) 到 \(T_b\ (S_b\neq T_b)\) 的路径上来回走动,询问他们最早会相遇在哪个节点;如果永不相遇则输出 \(-1\) 。
对于每一组询问,我们可以用BFS或者LCA之类的算法计算出两个人路径相交的点的编号,随后依次枚举两个人到达这些点的时间方程,随后对这些方程求解最小正整数解即可。
- \(A\) 到某一点 \(x\) :\(2k_1 \cdot {\rm dis}(S_a,T_a)+{\rm dis}(S_a,x)\) 或 \((2k_1+1) \cdot {\rm dis}(S_a,T_a)+{\rm dis}(T_a,x)\) 其中 \(k_1\) 为非负整数。