题目大意: 就是给你一棵以1为根的树,询问每一个节点的子树内节点数最多的深度(相对于这个子树根而言)若有多解,输出最小的. 解题思路: 这道题用树链剖分,两种思路: 1.树上DSU 首先想一下最暴力的算法:统计子树每个深度节点的个数(桶)相当于以每个节点为根遍历子树搜索一遍答案,这样做时间复杂度是O(n2),显然过不去. 考虑一下优化.假如说我们模拟一下搜索答案的过程,我们发现在每一次暴搜时都会在桶中添加一些答案.而这些答案的整体只会对该节点及其祖先产生贡献,也就是说,只有该节点以及其祖先的桶中…
[UOJ#33][UR #2]树上GCD(长链剖分,分块) 题面 UOJ 题解 首先不求恰好,改为求\(i\)的倍数的个数,最后容斥一下就可以解决了. 那么我们考虑枚举一个\(LCA\)位置,在其两棵不同的子树中选择两个点,那么贡献就是这两段的\(gcd\). 那么发现要统计的东西类似于\(u\)的子树中,深度为\(d\)的点的个数,这个可以很容易的用长链剖分来维护,那么维护出这个数组之后就可以\(O(\log {dep})\)的对于贡献进行计算.然而这个复杂度是假的,因为你每次都需要一次\(O…
正题 题目链接:https://uoj.ac/problem/33 题目大意 给出\(n\)个点的一棵树 定义\(f(x,y)=gcd(\ dis(x,lca),dis(y,lca)\ )\). 对于每个\(i\)求有多少对\(f(x,y)=i(x<y)\) \(1\leq n\leq 10^5\) 解题思路 首先肯定是枚举\(lca\)节点,然后看他子树里的情况,比较麻烦的是\(gcd\)刚刚好是\(d\),但是其实我们可以是\(d\)的倍数的情况,然后后面再容斥出答案. 如果,然后暴力算的话…
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 看完题目,一般人都能想到 容斥稳了 .这样我们只要统计有多少点对满足gcd是i的倍数. 考虑长链剖分,每次合并的时候,假设我已经求出轻儿子子树内每一个距离的点的数量,我们需要先对这个序列做一个变换,把每个数变成下标是它倍数的数的和. 然后枚举轻儿子到这个点距离dis,这样答案加上现在这棵树内已经计算的部分中 到这个点的距离是dis的倍数的数的和. 考虑分块,对于dis>=k的,暴力做.对于dis<=k的,我们顺便维护数组f[i]…
求树上最长链:两遍搜索. 第一次从树上任意点开始,最远点必然是某一条最长链上的端点u. 第二次从u开始,最远点即该最长链的另一端点. 先在最长链上走,不足再去走支链. 把询问数m错打成n,狠狠wa了一次= = #include<stdio.h> #include<string.h> ; struct E{ int v,next; }e[MAXN<<]; struct Q{ int p,c; }q[MAXN]; int tol; int head[MAXN]; int v…
HDU#4607. Park Visit 题目描述 Claire and her little friend, ykwd, are travelling in Shevchenko's Park! The park is beautiful - but large, indeed. N feature spots in the park are connected by exactly (N-1) undirected paths, and Claire is too tired to visi…
F. Dominant Indices 题意: 给一颗无向树,根为1.对于每个节点,求其子树中,哪个距离下的节点数量最多.数量相同时,取较小的那个距离. 题目: 这类题一般的做法是树上的启发式合并,复杂度是O(nlogn).但由于这题所求的信息与深度有关,因此可以使用长链剖分的技巧,复杂度可以是O(n). 长链剖分可以维护以深度为下标的信息.先预处理,以深度为依据,标记长儿子.维护答案时,对于每个节点,O(1)继承其长儿子的信息.然后暴力合并其他儿子.则时间复杂度是所有长链的长度之和,即O(n)…
传送门 官方题解其实讲的挺清楚了,就是锅有点多-- 一些有启发性的部分分 L=N 一个经典(反正我是不会)的容斥:最后的答案=对于每个点能够以它作为集合点的方案数-对于每条边能够以其两个端点作为集合点的方案数.原因是:对于每一种合法方案,集合点一定是树上的一个连通块,满足\(n=m+1\).算点时,这种方案被算了\(n\)次:算边时,这种方案被算了\(m=n-1\)次,所以每一个方案都恰好被算了一次. 有\(DP\):设\(f_i-1\)表示选择了包含\(i\)和\(i\)的子树中的点的一个连通…
[BZOJ3653]谈笑风生(长链剖分) 题面 BZOJ 洛谷 权限题啊.... 题解 首先根据题目给的条件,发现\(a,b\)都要是\(c\)的父亲. 所以这三个点是树上的一条深度单增的链. 因为\(a,b\)之间距离不超过\(k\),并且\(a\)被钦定了,所以只有两种情况: 一种是\(a\)是\(b\)的祖先,贡献是\(\sum_b size[b]-1\),也就是所有\(b\)可以选择的点的子树和. 另外一种\(b\)是\(a\)的祖先,贡献是\(\sum_b size[a]-1\),钦定…
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 -  https://www.nowcoder.com/acm/contest/145/I 题意 给定一棵有 $n$ 个节点的树,问有多少个点集的直径恰好等于 $D$ . 一个点集的直径定义为该点集中距离最远的两个点的距离. 两个点的距离定义为他们在树上的最短路径经过的边数. $n\leq 10^5$ 题解 我的做法有点难写,官方…