关于树链分治的一些东西

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

251001324846821.png

例题

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

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

算法1

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

算法2

这个算法基于一个简单的结论:每个询问的答案不会超过\(\frac n k\)。这样,我们确定一个阀值\(x=\sqrt n\),当\(k\leq 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)\)的。

251034155311833.png

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

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

转载于:https://www.cnblogs.com/wangck/p/4455455.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值