比赛日志
维护连通块
现有一棵 个节点的树。我们构建一最小的连通块 ,包含编号在 中的所有节点。多次询问,每次对于任意一对 ,询问关于这连通块的信息。
如果可以离线/可持久化,此类问题有一通用思路:用扫描线维护“ 固定时不同 构成连通块的信息”。若 ,则 ;对于一固定的 ,我们维护 分别取 (向左拓展)时,连通块的增量。对于点 ,我们记录 表示 固定时使得 的最大的 。假设已经对于 维护好了;现在拓展到 。
若 ,则 是
- 在 到 的简单路径上,且
的充分必要条件。
考虑任意 。由于 是极小的,故将 “加入” 得到 ,只需找到 和连通块在树上最接近节点之间的路径,将路径上所有点加入连通块;由树的性质,此路径是通向 中任意节点的必经之路,也即 的最短路径的某一前缀。又当 时, 就是该路径本身;再有 ,故本命题得证。
因此,我们需将整条路径上的点的最大出现时间整体覆盖成 ( 本身除外,它是 )。可以使用珂朵莉树和树剖维护连续的 相同的一段。设 表示连续段个数。每次覆盖操作会对 条重链执行“删除若干连续段,加入 个连续段”的操作。又 ,则 的总变化量是 的。因此若用对数级别有序关联式容器(如 std::map
),总时间复杂度为 。
(更多…)
题意简述
给定不含重边的有向图 ,设其邻接矩阵为 ,定义其元素的“加”为逻辑或,“乘”为逻辑与。问 在何时出现循环节(),以及最小循环节长度 (即,, 均最小)。
题意转化
在原图上,从 出发,可用恰 步走到 ,则在 次迭代后的图上有有向边 。问最少迭代多少次后图的形态出现循环节。
强连通图的所有环环长的最大公约数
任意找一点 ,只需考虑经过 的所有环。
考虑有一不经过 的环,其长为 ;另有一经过所有点的环(本图强连通),其长为 。则有 。
我们任意找一棵本图的搜索树。设其根为 。设节点 的深度为 。设某经过 的有限长度的环依次经过了非树边(横叉边、返祖边) 。那么其环长在答案中可以被 取代。
可得 一定是 的祖先。我们删去 ,得到另一个环;这环与原来环的长度差为 。这两环均在答案中作出贡献;又由于 ,则我们将原来的环长等价替换为两个数:其一即 ,其二为现在的环长。再继续删除 ,便等价地换为 个数。
因此我们遍历一遍搜索树,就可以在 的时间内求出所有环环长之 。 (更多…)
题意简述
给定长为 的序列 。要求支持以下操作:
- 给定 ,将 全部加上 ;
- 给定 ,将 全部乘以 ;
- 给定 ,若这是第 次操作,则保护 直到第 次操作(含),这期间操作 对 无效。若 已经被保护到 ,则这一保护不会失效。
- 给定 ,输出 ,对 取余。
。