《我TM才不想学点分系列》
话说某一天ATP和它的小伙伴们学了一个叫做dsu on the tree的东西。。然后发现这个玩意儿好方便啊还跑得很快。。。好像不但可以统计子树节点还可以统计树上路径啊。。然后ATP开心地想我是不是可以不用学点分了。。
然而几个小时以后ATP它们发现用这个东西做树上路径问题非常恶心。。再几个小时之后ATP它们又发现一个用dsu on the tree写起来恶心到爆的路径统计题。。然后。。。。。。
zyf2000(毫无波动):我写点分。
ATP(黑人问号):???
没错点分治这种东西如果用来做树上路径统计问题的话,每次只需要考虑某一棵单独的子树,进一步地说,可能只需要考虑某一棵单独的子树中经过根节点的路径情况。所以处理起来有其他算法难以替代的方便之处。。
有一篇讲树分治的论文:2009年 漆子超《分治算法在树的路径问题中的应用》
(UPD-半小时后)zyf2000:我TM现在波动很大啊我好像写错了= =
(UPD-一小时后)zyf2000:MD我T了。
(UPD-五分钟后)zyf2000:MD我不用map了我改成二分。
(UPD-五分钟后)zyf2000:我TM点分写错了原来map也是可以过的。。
把树切成一块一块的吧
点分治的基本过程是对于当前处理的一棵树,从中选择一个点,这个点能够把这棵树分成尽量平均的好多棵更小的子树。然后就相当于有了很多更小的子问题,就可以分治下去求解。
点分治保证时间复杂度的关键就是选择的点能够把这棵树分得尽量平均,也就是分完了以后规模最大的那棵子树是所有划分方案中最小的。这样的话设原来的树规模为size,分完了以后规模最大的子树不会超过size/2。也就是说每次分治下去的子问题规模至少是砍去一半的。那么也就是说这样递归分治的层数不会超过log层,而因为每层处理的子树互不相交,每层总的复杂度是