做题记录 25.8.9

[2025“钉耙编程”中国大学生算法设计暑期联赛(7) 1002] 龙族栖息地

两点 \((x,y,z)\)\((p,q,r)\) 之间的距离显然为 \(\frac12(|x-p|+|y-q|+|z-r|)\),令 \(f(x,y)\) 表示选择 \((x,y)\) 时的答案,则有

\[f(x,y)=\frac 12\sum_{i=1}^n(|x-q_i|+|y-r_i|+|x+y-q_i-r_i|) \]

\(x\) 确定时转化为形如 \(b+\sum_{u\in S}|y-u|\) 的最小值,使用 std::nth_element 容易做到 \(O(n)\)

发现 \(g(x)=\min_y f(x,y)\) 为下凸的,因此对 \(x\) 三分

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

代码

[2025“钉耙编程”中国大学生算法设计暑期联赛(7) 1012] 字典树逆向

显然字符串数量的最小值为叶子的数量,此时根到每个叶子的路径代表一个字符串

当所有结点的儿子都确定顺序后,显然最优解为对于每个点,将它到每个儿子的边依次赋边权 \(1\sim |son|\)

因此考虑从下往上依次对每个点的儿子排序

\(s_u\) 表示将子树 \(u\) 内所有叶子到 \(u\) 组成的字符串按顺序拼在一起,相邻两个拼接的时候中间插入一个字典序极小的字符

对于一个点的两个儿子 \(u,v\)\(u\) 排在 \(v\) 前当且仅当 \(s_v\)\(s_u\) 的前缀或两者不互为前缀关系且 \(s_u<s_v\)

比较时,若至少一方为叶子则直接返回,否则依次比较其儿子

可证时间复杂度 \(O(m\log^2 m)\)

代码

posted @ 2025-08-10 18:35  Hstry  阅读(15)  评论(0)    收藏  举报