1 条题解
-
0
题目大意 给定一棵 个节点的树,边带正权。 定义任意两点 之间的:
:路径上的最大边权
:路径上的边数
要求统计满足
w ( u , v ) − l ( u , v ) ≥ k w(u,v)−l(u,v)≥k 的无序点对 的数量。
条件转化 我们要数:
max e ∈ path ( u , v ) w e − dist edge ( u , v ) ≥ k e∈path(u,v) max w e −dist edge (u,v)≥k 其中 是路径上的边数(不是边权和)。
等价于:
max e ∈ path ( u , v ) w e ≥ dist edge ( u , v ) + k e∈path(u,v) max w e ≥dist edge (u,v)+k 思路分析 直接枚举所有点对 不可行()。
常见技巧:
考虑按最大边权来统计,比如用并查集从大到小加边(Kruskal 重构树思想)或者点分治。
点分治做法 在点分治时,对于重心 ,考虑经过 的路径 。
对于 :
,其中 (边数)
,其中 是 到 路径上的最大边权。
那么条件:
max ( M u , M v ) ≥ d u + d v + k max(M u ,M v )≥d u +d v +k 分类讨论: Case 1: 条件: 即 。
Case 2: 条件: 即 。
为了避免重复计算 的情况,可以严格分成:
时用 Case 1
时用 Case 2
时,按节点编号大小再分。
实现方法 在点分治时,对每个子树,收集所有 ,然后按 排序,用 Fenwick 树或排序+双指针统计满足上述不等式的数量。
复杂度:。
针对链的部分分 子任务 2 是链(35分),可以双指针: 固定左端点 ,向右找最小的 使得 ,然后所有 都满足。 可以用单调栈 + 稀疏表做,但这里 增加时, 会变化,不太好直接双指针?可能需要枚举 ,二分 ,用 ST 表求区间最大值,。
最终算法选择 正解应是点分治,按上述分类统计,注意去重。
总结 本题核心是树上的路径统计问题,通过点分治将路径按重心分解,利用排序或树状数组高效统计满足 的路径数。 主要难点在于分类讨论 的情况,并保证不重不漏。
- 1
信息
- ID
- 4775
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者