大意
给定一棵树, 有点权, 求两两间点权互质的点的距离之和.
题解
数论
考虑使用容斥.
设 为 中的质数.
设 为树中两个点间点权的 gcd 为 的倍数的路径集合, 为 的所有路径的长度之和.
那么
观察上式的系数以及 中的 可以发现, 时, 系数为 , 有一个因数时, 系数为 , 两个为 , 三个为 , 同时不存在 有两个及以上因数的项.
可以发现符合莫比乌斯函数的性质.
所以
树论
现在要求 .
可以用树上启发式合并.
设 为当前记录的子树中, 的 .
那么, 点 的贡献为:
给定一棵树, 有点权, 求两两间点权互质的点的距离之和.
考虑使用容斥.
设 为 中的质数.
设 为树中两个点间点权的 gcd 为 的倍数的路径集合, 为 的所有路径的长度之和.
那么
观察上式的系数以及 中的 可以发现, 时, 系数为 , 有一个因数时, 系数为 , 两个为 , 三个为 , 同时不存在 有两个及以上因数的项.
可以发现符合莫比乌斯函数的性质.
所以
现在要求 .
可以用树上启发式合并.
设 为当前记录的子树中, 的 .
那么, 点 的贡献为:
给定若干物品, 一些物品可以直接购买, 不过有数量限制, 另一些物品需要若干其他的物品合成得到, 每个物品都有价值, 被合成消耗的物品不算价值, 给出购买的价钱限制, 求价值最大, 保证合成的方式构成森林.
这题与其他的背包题不同的是, 需要分开来考虑用来用的和用来合成的, 需要加一个维度.
设 为考虑到 这个物品, 个用来合成, 花费 的最大价值.
设 为购买或者从下级合成而来的个数.
对于购买的物品:
对于合成的物品:
其中 表示合成 需要 个物品 .
合成的物品可以分别考虑需要的各个物品,
先枚举 , 再枚举 .
给定一棵树, 树上预先有两个节点被标记, 每个单位时间, 被标记的点可以标记一个相连的点. 求把整课树标记的最小时间.
考虑 dp.
设 为将 标记后, 还需多久将以 为根的子树全部标记.
可以贪心处理: 设 为 从大到小排序后的结果,
那么
然后将将树看作如下形式:

然后二分最初的点中间的链断开的位置, 分别从两侧转移, 求最大值.
断开的边越靠右, 左侧节点的 越大, 右侧的 越小.
而最优方案一定是 最小, 故二分第一个使得 的边即可.
给定一个无向图, 有边权, 任意添加一条边, 使得任意删除一条边使得图不联通的代价最大.
先跑一遍 Tarjan , 建出搜索树, 显然删除不是割边的边无法使图不联通, 故将它们的边权设为 .
然后二分答案, 将边权比答案小的边的新边权设为 , 否则设为 (包括非割边) .
若要使答案成立, 必须找到一条路径, 使得覆盖所有的 边.
如下图, 这显然不能成立:

这个可以成立:

显然, 选择直径最优. 然后跑一遍直径, 检查是否等于 边的个数即可.
树上的问题,对于一个节点,需要统计其的子树,且由于一些限制(主要是空间),无法直接合并多个直接子儿子的状态,只能 统计,而 DSU on tree 可以优化至
1 | void dfs(int u, int f) // 树链剖分 |
1 | sort(operations, (x, y) -> { |
最极端的情况
每次 右移一位, 在一个块中,至多移动
定义 为所有 到 的路径上, 路径上点权的最小值的最大的路径的最大值.
求 .
倒序按照点权加入, 用并查集维护连通性.
每次对于新联通的连通块,如 , 对于该点的答案贡献 ,其中, 为当前讨论的点.
(解释: 即里面选一个, 外面选一个)
最后, 再加上 . (解释: 当前点旧的连通块向新的连通块连边)
讨论最大值, 最小值时, 可以枚举最大值或最小值, 然后每次讨论时忽略更大或者更小的点.

每次操作添加边或删除边或询问联通.
线段树:






给定一个无向图, 有若干询问,分两种.
先跑一遍 , 建出 树.
设 .
询问一:

询问二:

在有向图上, 有长度为 的边, 对于每个询问,给定 , 求出当 取不同正整数时, 最短路的值有多少种, 并且求出他们的和.
对原图跑分层图最短路, 记 为从 至 , 恰好经过 条长度为 的边的最短路, 在求最短路时, 令 .
可以得到若干条方程 , 枚举考虑最短路经过 条长度为 的边的情况, 联立所有方程, 可以得到 (设 )
然后可以求出 的取值范围, 对答案的贡献即为
(注: 不等式中, 不能两边都取等, 否则整数值会被重复考虑. )