隐藏
Bill Yang's Blog

路终会有尽头,但视野总能看到更远的地方。

0%

长链剖分常用于优化一类特殊的动规,它可以在满足某些要求时,将$O(n)$的转移复杂度均摊为$O(1)$。
此外,长链剖分还有一些优秀的性质,但目前长链剖分在信息学竞赛中应用并不广泛。

定义

长链

长链的概念与重链类似。
点$x$的长链指从点$x$出发,到达其最深的后代所经过的路径。

重儿子

$x$所在的长链上的儿子称为重儿子。
称为长儿子总觉得有什么不对

长链剖分

长链剖分的概念与重链(树链)剖分类似。
通过树上存在的长链,将树剖分为若干条不相交的路径。

顶点

称树上一条长链深度最小的点为该长链的顶点。

性质

性质$1$

对树长链剖分后,树上所有长链的长度和为$O(n)$。

此性质显然成立。

性质$2$

任意一个点$x$的$k$级祖先$y$所在长链长度一定$\ge k$。

证明:

  1. 若$x,y$在同一条长链上:

    显然成立
  2. 若$x,y$不在同一条长链上:

    因为不在同一条链,所以别的子树一样深或更深,结论依然成立。

应用

由于长链剖分根据深度大小进行剖分,因此可以解决一些与深度有关的问题。

应用$1$:$O(n\log n)-O(1)$在线询问一个点的$k$级祖先

首先花费$O(n\log n)$的时间预处理出ST表。
接着对树进行长链剖分,记$Len(x)$为点$x$所在长链长度。
对于每一个长链的端点$x$,求出其$\sum\limits_{i=1}^{Len(x)}$级祖先与$\sum\limits_{i=1}^{Len(x)}$级重儿子。
因为性质$1$,预处理时空复杂度均为$O(n)$。
同时预处理出$1\rightarrow n$每个数二进制表示最高位的$1$,也就是$highbit$,时间复杂度$O(n)$。

对于每次询问$x$的$k$级祖先,首先利用ST表跳跃到$x$的$2^{highbit(k)}$级父亲$y$处,令$r=highbit(k)$,显然有$k-r\lt r$。
根据性质$2$,有$y$所在长链长度$\ge r\gt k-r$,因此有$y$所在的长链顶点预处理的表一定包含$x$的$k$级祖先。
因此可以做到$O(1)$回答询问。

例题

应用$2$:$O(n)$统计每个点子树中以深度为下标的可合并信息

这个应用的思想十分类似Dsu on tree
思想是当前结点直接继承重儿子的信息,轻儿子信息暴力统计。
因为长链剖分的特殊性,因此这个应用仅限于以深度为下标。
更一般的就只能使用Dsu on tree做到$O(n\log n)$的复杂度了。

更具体地:
若需求出点$x$的信息,首先从重儿子继承。
因为以深度为下标,因此只需要对数组进行移位即可。
后面我们会提到移位的实现方法。

接着,轻儿子的信息暴力合并到当前的信息中。

时间复杂度$O(n)$。
分析如下:
每个点$x$只会暴力统计其所有轻儿子的信息,而每个轻儿子的信息大小为该轻儿子所在长链长度。
而当递归到$x$的父节点$fa(x)$时,若$x$不是$fa(x)$的重儿子,则$fa(x)$会暴力统计大小为$x$长链长度的信息。
故,每个长链只会对转移的复杂度做一次大小为其长度的贡献。
因此根据性质$1$,总时间复杂度为$O(n)$。

移位的实现方法
本处仅提到一种实现方式,但方法不只有这一种。
用指针维护动规数组,在重儿子传递给父亲时将指针左移/右移一位。(左移还是右移根据转移方程决定)
而给其他轻儿子分配不相交的内存即可。

不难发现,这样实现的空间复杂度仍为$O(n)$。
特别注意,这样实现也有相应的缺点,即若动规的数组高于一维,那么数组是一次性的,不能在完成转移后查询中间过程的值。
原因是部分内存被共用掉了。

例题

参考资料

$k$短路问题

$k$短路是一类经典问题,问题描述为:

给出一张任意图,询问图中$s\rightarrow t$的任意路径中长度第$k$小的。
其中路径的长度定义为构成路径的边的权值和。

阅读全文 »

题目大意

    Alice与Bob在玩一个游戏,两人各有$8$张牌,每个牌的点数在$0\sim4$之间,两人的牌双方均可见。
    双方轮流进行如下步骤:

  1. 选出自己的一张点数为$a$牌与对方的一张牌$b$,其中$a\cdot b\neq0$。
  2. 使用点数$c=(a+b)\bmod5$替换自己的点数为$a$的牌。

    当有一方的$8$张牌全为$0$,则该玩家胜利。
    给出$T(1\le T\le10^5)$种初始状态,并指出先手玩家,询问他们是否有必胜策略。
    若Alice必胜则输出Alice,Bob必胜则输出Bob,若平局输出Deal

阅读全文 »

题目大意

    假设有$x_1$个字母A,$x_2$个字母B,$\ldots$,$x_{26}$个字母Z,同时假设字母A的价值为$1$,字母B的价值为$2$,$\ldots$,字母Z的价值为$26$。那么,对于给定的字母,可以找到多少价值$\le50$的单词呢?单词的价值就是组成一个单词的所有字母的价值之和,比如,单词ACM的价值是$1+3+14=18$,单词HDU的价值是$8+4+21=33$。(组成的单词与排列顺序无关,比如ACMCMA认为是同一个单词)。

阅读全文 »

题目大意

    明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!
    我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西。理所当然的,你当然要帮他计算携带$N$件物品的方案数。
    他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等
    当然,他又有一些稀奇古怪的限制:
    每种食物的限制如下:

  • 承德汉堡:偶数个
  • 可乐:$0$个或$1$个
  • 鸡腿:$0$个,$1$个或$2$个
  • 蜜桃多:奇数个
  • 鸡块:$4$的倍数个
  • 包子:$0$个,$1$个,$2$个或$3$个
  • 土豆片炒肉:不超过一个。
  • 面包:$3$的倍数个

    注意,这里我们懒得考虑明明对于带的食物该怎么搭配着吃,也认为每种食物都是以‘个’为单位(反正是幻想嘛),只要总数加起来是$N$就算一种方案。因此,对于给出的$N$,你需要计算出方案数,并对$10007$取模。

阅读全文 »

真是奇怪啊,为什么我是先学生成函数的应用再学生成函数的概念的啊

在数学中,生成函数(generating function,又称母函数)是一种形式幂级数,个人认为生成函数这个名字更为优美。

生成函数是一个无穷级数,我们只关心生成函数的系数。
某些时候,我们只关心生成函数的前$n$项系数,也就是$A(x)\pmod x^n$,在多项式取模处有所叙述。

在OI中,我们常常用到两类生成函数:普通(组合)型生成函数指数型生成函数

阅读全文 »

题目大意

    我们的大朋友很喜欢计算机科学,而且尤其喜欢多叉树。对于一棵带有正整数点权的有根多叉树,如果它满足这样的性质,我们的大朋友就会将其称作神犇的:点权为$1$的结点是叶子结点;对于任一点权大于$1$的结点$u$,$u$的孩子数目$deg[u]$属于集合$D$,且$u$的点权等于这些孩子结点的点权之和。
    给出一个整数$s$,你能求出根节点权值为$s$的神犇多叉树的个数吗?请参照样例以更好的理解什么样的两棵多叉树会被视为不同的。
    我们只需要知道答案关于$950009857$($453*2^{21}+1$,一个质数)取模后的值。

阅读全文 »

题目大意

    我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树。
    考虑一个含有$n$个互异正整数的序列$c[1],c[2],\ldots,c[n]$。如果一棵带点权的有根二叉树满足其所有顶点的权值都在集合$\lbrace c[1],c[2],\ldots,c[n]\rbrace$中,我们的小朋友就会将其称作神犇的。并且他认为,一棵带点权的树的权值,是其所有顶点权值的总和。
    给出一个整数$m$,你能对于任意的$s(1\le s\le m)$计算出权值为$s$的神犇二叉树的个数吗?请参照样例以更好的理解什么样的两棵二叉树会被视为不同的。
    我们只需要知道答案关于$998244353(7\cdot17\cdot2^{23}+1$,一个质数$)$取模后的值。

阅读全文 »