题目链接:http://poj.org/problem?id=1741 题意:求树上两点之间距离小于等于k的点对的数量 思路:点分治模板题,推荐一篇讲的非常好的博客:https://blog.csdn.net/qq_39553725/article/details/77542223 实现代码: ...
分类:
其他好文 时间:
2018-07-16 14:12:33
阅读次数:
162
【题目链接】 http://poj.org/problem?id=1741 【算法】 点分治 要求距离不超过k的点对个数,不妨将路径分成两类 : 1. 经过根节点 2. 不经过根节点 考虑第1类路径,不妨从根节点进行一次深度优先遍历,求出每个点与根节点的距离,将距离排序,然后用两个指针扫描一遍即可, ...
分类:
其他好文 时间:
2018-07-15 16:08:29
阅读次数:
172
Description Solution 看到这种路径统计问题,一般就想到要用点分治去做。 对于每个重心$u$,统计经过$u$的合法的路径之中的最大值。 第一类路径是从$u$出发的,直接逐个子树深搜统计就可以了。第二类路径是由两棵不同子树中的两条第一类路径拼接而成的。 如果仅仅是统计长度在$[l,r ...
分类:
其他好文 时间:
2018-07-14 17:18:51
阅读次数:
189
Link: POJ 1741 传送门 Solution: 此题的难点在于点分治上的统计 如果依然采取每棵子树的结果与之前所有子树的结果合并的方式会比较麻烦 同时复杂度可能超过$O(n*log(n))$的限制 其实可以用一个简单的容斥来在$O(n*log(n))$统计结果: 先将所有点到重心的距离排序 ...
分类:
其他好文 时间:
2018-07-13 10:15:24
阅读次数:
174
题意:给出一棵点带权的树,求i$\in$[1,200000]所有路径的上点权的gcd==i的个数。 考虑点分治,对于一棵以u为根的子树,如何统计经过u的路径的答案? 显然既然是经过点u的路径,那么所有经过u的路径上的点权的gcd肯定是点u的点权的约数。 然后我们暴力算下,2e5以内最多只有160个约 ...
分类:
其他好文 时间:
2018-07-05 23:19:34
阅读次数:
160
说实话在很长一段时间内都对于点分治算法感觉到比较的害怕。主要是感觉它的复杂度非常的高,而且莫名给我留下了一种点分治是有板子的印象。实际上是没有的。而点分治由于将一棵树每次都尽量地划分为了相对平均的几块,所以就算代码写起来复杂度非常的高,效率往往而言也还是比较可观的。如果在考试的时候遇到点分治的题目, ...
分类:
编程语言 时间:
2018-07-03 00:18:58
阅读次数:
161
题目链接 "bzoj2599: [IOI2011]Race" 题解 点分治,用t[k]表示子树中距离root为k 的最小边路径 转移时先与前边子树和合并更新答案,然后更新距离父节点最优值,这样就保证不在同一子树内了 每次分层的时候记得清除答案 代码 c++ include include inclu ...
分类:
其他好文 时间:
2018-07-01 11:55:59
阅读次数:
201
在说点分治之前先说一下序列分治,序列分治大家都知道吧,就是把序列从某个位置(一般是中间点)分成两部分,统计跨越两部分的答案再递归处理两部分。树的点分治的道理和序列分治很像,但树没有中点,该怎么分治呢?再对比序列分治,序列相当于一条链,而序列的中点就是这条链的重心,那么树的分治点就可以是这棵树的重心。 ...
分类:
其他好文 时间:
2018-06-14 21:07:25
阅读次数:
232
题意:给定一棵有n个点的树,询问树上距离为k的点对是否存在。 总结:点分查询的时候,距离<=k - 1 && <= k的路径即为距离为k的点对 ...
分类:
其他好文 时间:
2018-06-03 17:31:12
阅读次数:
162
1316: 树上的询问 链接 分析 每次查找出重心(去掉重心后的最大的联通块最小,保证复杂度),然后统计过重心的路径中有没有长度等于len的。 统计时,由于必须要过重心,不能是同一棵子树中的。可以挨个遍历每棵子树,然后统计即可。 判断时,用set查找一下即可。 代码 ...
分类:
其他好文 时间:
2018-06-03 10:44:22
阅读次数:
200