zoukankan      html  css  js  c++  java
  • 点分治

    考虑以下问题:
    给你一棵树,有边权,一条路径合法当它的边权和 (=k) ,求合法的路径有多少条。 ((n,kle 2*10^5, ext{Time Limit=3s}))

    暴力 (O(n^2)) ,即对于每一个点dfs它的子树,把边权装桶。
    考虑如何优化。
    假设树是随机生成的。那么我们的暴力还是没有任何好转 。
    但是这是不可能的!
    所以,我们本来是选它的子节点继续统计,现在改成选它子树的重心。
    于是一切都解决了。
    复杂度 (O(nlog n))

    如果 (kle 10^9)
    对于每一个点dfs,记录其子树中所有点到它的距离,保存在一个 (dis[]) 数组里,然后sort一遍,再用two-pointers或者二分统计答案:有多少 (dis[i]+dis[j]=k(i<j))
    但是会有 (i,j) 在该点的同一棵子树内的情况,此时用容斥把它减掉。
    复杂度 (O(nlog^2 n))

  • 相关阅读:
    gcc相关
    test
    第二次课
    VS快捷键
    第7章 站在对象模型的尖端
    第6章 执行期语意学
    第5章 构造, 析构, 拷贝语意学
    第4章 Function语意学
    第一次课
    第3章 Data语意学
  • 原文地址:https://www.cnblogs.com/BlogOfchc1234567890/p/10902085.html
Copyright © 2011-2022 走看看