1 条题解
-
0
🔍 核心问题分析
题目要求计算路径上点集的最小线性拟合误差。简单来说:
- 每个行星系对应二维平面上的点
- 需要找到一条路径,使得路径上所有点到某条直线的欧几里得距离平方和最小
- 输出这个最小值作为非可疑度
🧮 关键思路:数学推导
1. 直线拟合与距离计算
设直线方程为 ,点到直线的距离平方和为:
2. 最优参数求解
通过求导可得最优 为:
$$b = \frac{\sum y_i}{n} - k \frac{\sum x_i}{n} = \bar{y} - k\bar{x} $$代入原式并化简后,得到最小相斥度的表达式:
$$\delta_{\min} = \min \left\{ \frac{A + C - \sqrt{(A+C)^2 - 4(AC-B^2)}}{2} \right\} $$其中:
⚙️ 算法实现
数据结构设计
需要维护六个关键变量:
- ( 的和)
- ( 的和)
- ( 的和)
- ( 的和)
- ( 的和)
- (点的个数)
图结构处理
根据题意 ,图可能是树或基环树。
对于树的情况:
- 以节点1为根进行DFS预处理
- 使用树上差分:路径信息 =
- 通过LCA(树链剖分)快速求路径信息
对于基环树的情况:
- 找出环上的一条边
- 对于查询 ,如果 在同一个子树,按树的方法处理
- 否则,有两条可能路径,取最小值
💻 代码框架
#include <bits/stdc++.h> using namespace std; struct Node { double s1, s2, s3, s4, s5; // ∑x, ∑y, ∑x², ∑y², ∑xy int cnt; Node operator + (const Node& t) const { return {s1+t.s1, s2+t.s2, s3+t.s3, s4+t.s4, s5+t.s5, cnt+t.cnt}; } Node operator - (const Node& t) const { return {s1-t.s1, s2-t.s2, s3-t.s3, s4-t.s4, s5-t.s5, cnt-t.cnt}; } double calc() { double A = s3 - s1*s1/cnt; double B = s5 - s1*s2/cnt; double C = s4 - s2*s2/cnt; return (A + C - sqrt((A+C)*(A+C) - 4*(A*C-B*B))) / 2; } }; // 树链剖分求LCA // 基环树找环 // 预处理每个点到根的信息📊 复杂度分析
- 预处理: DFS
- 查询: 求LCA和路径信息
- 总复杂度:,可以处理 的数据规模
💎 总结
这道题的解题关键在于:
- 数学推导出最小线性拟合误差的表达式
- 维护六个统计量来快速计算任意路径的拟合误差
- 利用树上差分处理路径查询
- 分类讨论树和基环树的情况
- 1
信息
- ID
- 5675
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者