初识点剖(基于点的树上分治)
来源:互联网 发布:java如何实现线程同步 编辑:程序博客网 时间:2024/06/05 18:33
有一类问题,是关于树上路径,树上点对,树上XX…之类的,我们可以考虑运用分治算法.
Description
给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K
Input
N(n<=40000) 接下来n-1行边描述边,按照题目中写的输入 接下来是k
Output
一行,有多少对点之间的距离小于等于k
如果说维护的是路径,那么这条路径有三种可能:
1. 在某个子树里
2. 通过根节点到达另外一颗子树(包括停留在根节点)
设
那我们需要求解的问题,就转换成了以下两个问题
问题一: 求满足
问题二: 求满足
但我们注意到,若在同一子树下有可能存在
那么,我们递归地考虑,在这种情况必定发生在同一子树中,那么每当递归到一颗新树,就用其
满足
的结果减去
满足
的结果,那么得出来的所有点对是绝对符合题意的,因为他们必定不在同一子树内.
剩下符合题意却没有计算的点,会在子树中递归计算.
若是无序点对则需要多添加一个i < j的条件
若该树是一条链,那我们需要做N次递归,每次计算答案是N log n(排序),即需要 n^2 log n级别的时间复杂度
所以,每一次用O(n)的时间找到树的重心(其实就是找到一个将树分的最平均的点,即最大子树节点数目不超过n/2)
然后再进行递归求解,每次计算一颗有N个节点的树的时间就是(n log n + k(n/k log n/k)…..) (K叉树)
n/k实际上是会越变越小,他收敛很快,所以大约就是n log n,常数略大
- 初识点剖(基于点的树上分治)
- 树上基于点的分治
- poj1741 树上点分治
- POJ1741Tree(树上点分治)
- 树上点分治入门
- POJ 1741 Tree(树上的点分治)
- 【bzoj1316】【树上的询问】【点分治+map】
- POJ 1741 树上 点的 分治
- BZOJ 1316: 树上的询问 点分治
- [bzoj3784][点分治]树上的路径
- 【点分治】【POJ 1741】【cogs 1714】树上的点对
- 树上点分治学习记录
- POJ_P1741 Tree(树上点分治)
- JZOJ4715树上路径 点分治
- 树上点分治模板bzoj1468
- 树基于点的分治
- 【jzoj4715】【树上路径】【树】【分治】【点分治】
- BZOJ 3784|树上的路径|点分治|堆|RMQ
- 关于Android屏幕适配应该知道的一些知识
- FFMPEG学习----使用SDL播放YUV数据
- Request的getParameter和getAttribute方法的区别
- Search Insert Position 插入位置
- BenignCertain:一款可以远程提取思科VPN密钥的黑客工具(含泄漏文件下载地址)
- 初识点剖(基于点的树上分治)
- 分布式Session与cookie
- 如何写出高效C++(定制new和delete和杂项讨论)
- WOJ1005 - Holding Animals
- 内核开发:第一个hello world 模块
- OkHttp的使用详解
- 一周一书一文(20160820):拆掉思维里的墙——古典
- Spring加载Hibernate失败:Error creating bean with name 'sessionFactory' defined in ServletContext... Null
- Jquery判断复选框选中