做题记录 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)\)