zoukankan      html  css  js  c++  java
  • 关于树链分治的一些东西

    《分治算法在树的路径问题中的应用》Orz

    例题

    给出一棵(n)个结点的有根树,每个结点有颜色。

    有若干询问,询问有多少种颜色,在(v)为根的子树中至少有(k)个结点属于该颜色。

    算法1

    莫队(好像都是这么叫的)离线方法Orz。时间复杂度(O(n sqrt n))

    算法2

    这个算法基于一个简单的结论:每个询问的答案不会超过(frac n k)。这样,我们确定一个阀值(x=sqrt n),当(kleq x)时的答案可以预处理出来,如果(k > x),我们也要预处理,不过对于每个点,数量大于(x)的颜色最多只有(frac n x)个,不会太多。
    这样的时间复杂度是(O(n sqrt n))的,是一个在线算法。

    算法3

    离线算法,启发式合并,时间复杂度(O(n (log n)^2))

    算法4 重点

    假设现在树退化成了链,你会怎么做呢?
    当然是开两个数组,(num[i])表示(i)颜色出现的次数,(cnt[i])表示(k=i)时的答案。这样,我们从链尾到链头扫一遍就可以(O(n))解决了。

    现在是树,我们先把它剖成若干条链(其实是小于(log n)条),然后对于一条链,同样采用上面的方法,只不过有个问题,这条链上可能带有若干其他的链(如图),这样对于长度为(m)的链,我们统计的复杂度并不是(O(m))的。

    1 2 3 4 这条链就连着一些其他链。

    其实,我们直接暴力统计其他的链,由于每个点到根最多只会遇到(log n)条链,所以每个点只会被拿去统计(log n)次。所以我们得到一个漂亮而简洁的算法,时间复杂度(O(n log n))
    估计代码非常短,速度非常快!

  • 相关阅读:
    【HTML5】html5在ie8及以下的兼容性问题
    【前端】从登录框看前端
    批量插入
    Mongodb地理空间索引
    Mongodb添加地理位置索引
    记一 次docker-compose build报错
    The method's class, com.google.common.collect.FluentIterable, is available from the following locations
    如果在chrome的新标签中继续打开开发工具
    设置idea 2018 的vmoptions无效
    spring boot(2):activiti整合
  • 原文地址:https://www.cnblogs.com/wangck/p/4455455.html
Copyright © 2011-2022 走看看