1 条题解

  • 0
    @ 2025-10-30 16:10:12

    题目大意 给定一棵 nn 个节点的树,边带正权。 定义任意两点 u,vu,v 之间的:

    w(u,v)w(u,v):路径上的最大边权

    l(u,v)l(u,v):路径上的边数

    要求统计满足

    w ( u , v ) − l ( u , v ) ≥ k w(u,v)−l(u,v)≥k 的无序点对 (u,v)(u,v) 的数量。

    条件转化 我们要数:

    max ⁡ e ∈ path ( u , v ) w e − dist edge ( u , v ) ≥ k e∈path(u,v) max ​ w e ​ −dist edge ​ (u,v)≥k 其中 distedge(u,v)\text{dist}_{\text{edge}}(u,v) 是路径上的边数(不是边权和)。

    等价于:

    max ⁡ e ∈ path ( u , v ) w e ≥ dist edge ( u , v ) + k e∈path(u,v) max ​ w e ​ ≥dist edge ​ (u,v)+k 思路分析 直接枚举所有点对 O(n2)O(n^2) 不可行(n105n \le 10^5)。

    常见技巧:

    考虑按最大边权来统计,比如用并查集从大到小加边(Kruskal 重构树思想)或者点分治。

    点分治做法 在点分治时,对于重心 rtrt,考虑经过 rtrt 的路径 (u,v)(u,v)

    对于 urtvu \to rt \to v

    l(u,v)=du+dvl(u,v) = d_u + d_v,其中 du=dist(u,rt)d_u = \text{dist}(u,rt)(边数)

    w(u,v)=max(Mu,Mv)w(u,v) = \max(M_u, M_v),其中 MuM_uuurtrt 路径上的最大边权。

    那么条件:

    max ⁡ ( M u , M v ) ≥ d u + d v + k max(M u ​ ,M v ​ )≥d u ​ +d v ​ +k 分类讨论: Case 1: MuMvM_u \ge M_v 条件:Mudu+dv+kM_u \ge d_u + d_v + kdvMudukd_v \le M_u - d_u - k

    Case 2: MvMuM_v \ge M_u 条件:Mvdu+dv+kM_v \ge d_u + d_v + kduMvdvkd_u \le M_v - d_v - k

    为了避免重复计算 Mu=MvM_u = M_v 的情况,可以严格分成:

    Mu>MvM_u > M_v 时用 Case 1

    Mu<MvM_u < M_v 时用 Case 2

    Mu=MvM_u = M_v 时,按节点编号大小再分。

    实现方法 在点分治时,对每个子树,收集所有 (du,Mu)(d_u, M_u),然后按 MuM_u 排序,用 Fenwick 树或排序+双指针统计满足上述不等式的数量。

    复杂度:O(nlog2n)O(n \log^2 n)

    针对链的部分分 子任务 2 是链(35分),可以双指针: 固定左端点 ll,向右找最小的 rr 使得 M(l,r)(rl)kM(l,r) - (r-l) \ge k,然后所有 rrr' \ge r 都满足。 M(l,r)M(l,r) 可以用单调栈 + 稀疏表做,但这里 ll 增加时,M(l,r)M(l,r) 会变化,不太好直接双指针?可能需要枚举 ll,二分 rr,用 ST 表求区间最大值,O(nlogn)O(n \log n)

    最终算法选择 正解应是点分治,按上述分类统计,注意去重。

    总结 本题核心是树上的路径统计问题,通过点分治将路径按重心分解,利用排序或树状数组高效统计满足 wlkw - l \ge k 的路径数。 主要难点在于分类讨论 max(Mu,Mv)\max(M_u, M_v) 的情况,并保证不重不漏。

    • 1

    信息

    ID
    4775
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者