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