题意

给定一棵 $n$ 个点的无根树,每个点有点权,求长度为 $D$ 且满足路径点权的 $\gcd$ 大于 $1$ 的路径个数。

其中 $3 \le n \le 5 \cdot 10^5$,值域 $[1,30000]$。

分析

记 $f(n)$ 表示路径 $\gcd$ 和为 $n$ 的路径数,$g(n)$ 表示路径 $\gcd$ 为 $n$ 的倍数的路径数。

因此有

$$
g(d)=\sum_{d|n} f(d)
$$

由莫比乌斯反演

$$
f(d)=\sum_{d|n} \mu(\frac{n}{d}) g(n)
$$

因此答案 $S$ 就是

$$
S=\sum_{i=2}^\infty f(i)=\sum_{i=2}^\infty \sum_{i|d} \mu(\frac{d}{i}) g(d)
$$

交换求和顺序

$$
S=\sum_{d=1}^\infty g(d) \sum_{i>1 \land i|d} \mu(\frac{d}{i}) = \sum_{d=2}^\infty g(d)(0-\mu(d))
$$

于是只需要计算 $g(d)$ 即可,枚举值域 $i \in [2,30000]$ 且 $\mu(i) \neq 0$,计算有多少条长度为 $D$ 的路径的点权都是 $i$ 的倍数。将这些点拿出来,显然是这个点集构成一个森林,下面考虑一棵树的情况。记 $dp(u,i)$ 表示以 $u$ 为根节点的子树内距离 $u$ 为 $i$ 的点数。状态数和转移的复杂度都是 $O(n^2)$ 的,套用长链剖分优化关于深度信息合并的技巧,可以做到 $O(n)$ 的时空求出这个 $dp$ 数组。

阅读全文 »

rank solved A B C D E F G H I J K L
49 7 O . O . . . Ø . O O Ø Ø
阅读全文 »

题意

给定一棵带边权的无根树,要求删除一些边使得每个点的度数不超过 $k$,最小化费用,对所有 $[0,n-1]$ 中每个数回答询问。

其中 $2 \le n \le 250000$。

分析

首先,假如只有一个询问,记当前的最大度数为 $k$,设 $dp(x,0/1)$ 表示删除一些边使得 $x$ 点剩余度数为 $k$ 和 $k+1$ 的最小费用。转移时,不妨令所有边都没有被删除,将删除一条连向 $v$ 边权为 $w$ 的边产生的影响记录下来,即 $w+dp(v,1)-dp(v,0)$,如果是非负数直接选择,否则选择一些最小的。

回到原题,如何批量回答所有询问?

注意到一个事实:$\sum_{k=0}^{n-1} \sum_{u=1}^{n} [deg(u)>k]=2n-2$

考虑从小到大枚举最大度数 $k$,记度数大于 $k$ 的为关键点,否则为非关键点。

每个点维护一个堆,表示它删除所有连向非关键点的边的影响,因为非关键点度数小于等于 $k$,它的边随便删不删都行,因此这个影响等价于边权。

为了保证复杂度,每次只能 dfs 所有关键点构成的森林。因为非关键点的影响已经在堆内维护好了,只需要把关键点的影响丢进去即可,用类似与上述的方案求出相应的 $dp$ 值,注意出栈的时候,需要撤回一下关键点的操作。

阅读全文 »

树论

在算法竞赛中,树是一种应用广泛的抽象数据类型或者实现抽象数据类型的数据结构。

树结构可能会出现各种各样的题目中,作为解决问题算法或者问题本身。

线段树 / 树状数组维护 ······ 即可!

给一棵树,······,求 ······!

树论主要讨论在具体的一般树上的算法和问题。

阅读全文 »