2024 syzx 冬季训练 6 - 树

A

问题等价于任选一条路径,使路径长度减路径端点权值的差最大。

B

\(\lceil \frac{n}{2}\rceil+3\) 次询问一条边是否存在,判断一棵树是菊花还是链。

\(\lceil \frac{n}{2}\rceil\) 次询问问遍 1 到 n,找出一条边,3 次判断答案。

C

DP 做法

考虑树形 DP,对于一个子树而言,最多可能有 4 种情况:贡献 1 个给父亲、不需要父亲贡献、父亲贡 献 1 个给该子树、父亲贡献 2 个给该子树。 那么,设 \(f_{u,-1/0/1/2}\)分别表示子树 u 对应的这些情况。转移时考虑枚举 u 所有儿子 v 的情况,注意一 下 u 自己本身是否已经种上树、以及两个 \(f_{v1,1},f_{v2,1}\) 可以合并(即使用一次操作完成)的情况即可。 实现细节可能较多。

贪心做法

对于一次操作,最多完成两个未完成的节点。 对于一个大小为 siz 的子树,且只有根节点完成了,那么一共需要 \(\lfloor siz/2\rfloor\) 次操作。 对子树根节点是否完成进行分类讨论:

  • 如果根节点已经完成了,那么这个子树对根节点父亲的贡献就有两种情况:用最少次数做完子树 时,是否存在多余的、且对子树根节点的父亲有贡献的操作。

  • 如果根节点没有完成,则直接将 siz 向上传递。直到遇到一个已经完成的祖先,在那个祖先中对 siz 进行统计即可。

    总的时间复杂度为 O(n)。

D

路径的花费为最大值加次大值,求从 1 到 n 的最小花费。

首先可以注意到最大的边在原图的最大生成树上。所以我们先求出最大 生成树,然后分别从 1 和 n 出发对树进行 dfs,求出 1 或者 n 到其他点 的瓶颈边的权值。接着枚举次大的边 (u, v),再枚举 1 是和 u 连的还是 和 v 连的,求出瓶颈边,两者一拼可得结果。 注意特判只通过一条边连接的情况。

E

判断一个图的所有生成树是否同构。

除了树和基环树都是 no。

对于基环树,环上的有根树排开长成 aaaaa 和 ababab 这样时是 yes,其他是 no。

F

给定一棵树,有一些关键点 ci,你需要选定 r 和 d。最小化 \(\frac{\sum dis(r,c_i)}{\gcd dis(r,c_i)}\)

对于节点 u,它到子树内的关键点的距离的集合为 \(\{a_1,a_2\ldots a_c\}\)。记 \(f_u=a_1,g_u=\gcd (a_2-a_1,\ldots a_c-a_1)\)

这样的状态可以转移,换根 dp 即可。

G

给定一颗二叉树,每个点有两个属性 \(a_i,b_i\),你需要对每个点 \(u\) 解决以下问题:你可以随意取或不取 \(u\)\(u\) 的祖先的 \(a_i\),问是否可以使取出来的 \(a\) 的和等于 \(b_u\)

\(n\le 300000,a_i\le 2000000\)

而这显然是不可做的,为了降低难度,你可以任意修改最多 5000 个点的 \(a_i\),然后再做以上问题。

空间 256mb

把前 11 行改成 \(2^{20},2^{19},\ldots ,2^{10}\),令 \(dp_i\) 表示选出的数的和二进制后 10 位为 i,高位的最小值。

用重链剖分压缩空间,先走亲儿子(从父亲的 dp 复制一份),走完之后就可以销毁副本,最后再走重儿子(直接从父亲继承)。

H

选 k 条路径交的点数总和减去选 k 条路径交的边数总和就是答案。

I

两人博弈,给定一个森林,每人每轮采取以下行动之一:

  1. 删一条边
  2. 删一个点

无法行动者输,问先手第一步有多少种行动方法,使得自己必胜。

考虑单棵树的 SG 函数。 结论:对于有奇数个结点的树,其 SG 函数值为 1。对于有偶数个结点的数,其 SG 函数值为 2。

J

定义 \(\omega(x)\)\(x\) 的质因数个数。

\(q\) 次询问,每次输入 \(l,r\),以下方式生成一张图:

点的编号为 \(l\ldots r\)\(x\)\(y\) 之间的边的边权为 \(\omega(lcm(x,y))\)

求最小生成树。

\(\sum r\le 10^6\)

首先考虑 [L,R] 范围中存在质数的情况。基于Kruskal,此时对于任何一个数 x, 只需要考虑价值为 w(x) 和 w(x)+1 的边即可(要么找一个质因子集合包含 x 的数 相连,要么和那个质数相连)。

我们可以预处理出每个整数 x 在 1e6 范围内的两个值:

  • l_x : 小于 但其质因子集合被 " 的质因子集合" 包含的最大的数。

  • r_x : 大于 但其质因子集合被 " 的质因子集合" 包含的最小的数。

    这两个值都可以 O(nlogn) 处理。(用欧拉筛求出最小质因子,即可 O(logn) 分解质因子。搜索以遍历 x 质因子集合的数)

质因子集合相同的整数之间,可以先互相连接形成连通块,视为一个点。每个点贪 心向任何一个自己包含的点连边即可,最后会剩下一些没有出度的点。这些点当中 必有一个单质数点,贪心连向这个点即可。基于预处理,该贪心过程可以 O(n) 实 现。

对于范围中不存在质数的情况,说明这个区间很小(可以筛一遍看看区间的最大值),直接prim最小生成树即可。

K

交互题。

输入一颗二叉树,你需要找到一个隐藏的点 \(s\),最多询问 \(\lfloor\log_2n\rfloor\) 次。

每次询问 \(u,v\),回答为 \(t\)

  • \(t=0:dis(u,s)<dis(v,s)\)
  • \(t=1:dis(u,s)=dis(v,s)\)
  • \(t=2:dis(u,s)>dis(v,s)\)

节点为 n 的树重心 u 满足:去掉 u 之后,剩下的连通块点 数小于等于 n/2。因为给定的是二叉树,所以我们可以对 u 的 度数进行讨论。

  • u 度数为 0:答案就是 u。

  • u 度数为 1:说明 n = 2,询问 u 和邻居即可知道答案。

  • u 度数为 2:询问 u 的两个邻居,即可把问题规模缩小至 ⌊ n/2 ⌋。

  • u 度数为 3:询问三个连通块里较大的两个。最小的那个连 通块加一,一定小于等于 ⌊ n/2 ⌋,可以按 n 的奇偶性讨论来反 证 3 × ⌊ n/2 ⌋ + 1 ≤ n 是不满足的。

因此每次询问可以把问题规模从 n 变成 ⌊ n/2 ⌋,就能在 ⌊log2 n⌋ 次询问内找到答案。

L

把一颗树划分成若干联通块,每个的贡献为次大值,最大化贡献值的和。

注意到一个区域的价值只会收到最大值和次大值的影响,其他点不影响 区域的价值。于是不难猜想一个区域只需要保留最大值和次大值作为端 点的这条路径即可。 现在问题变成了,给出一棵树,把树划分成若干路径,每条路径的价值 等于端点之中较小的一个,所对应的最大价值和。 可以考虑 DP:用 fi,j 表示以 i 为根的子树,其中延申到 i 的链另一个端 点的价值为 j,其他部分的最大价值和。gi 表示以 i 为根的子树,能构成 的最大价值。

用 fi,j 表示以 i 为根的子树,其中延申到 i 的链另一个端点的价值为 j, 其他部分的最大价值和。gi 表示以 i 为根的子树,能构成的最大价值。 转移的时候,依次枚举 i 的每个儿子 son,对 f 有转移

\[f_{i,j}=\max\{f_{i,j}+g_{son},f_{son,j}+\sum_{k\in other\ son}g_k\} \]

对 g 有转移

\[g_i=\max\{g_i,f_{i,j}+f_{son,k}+\min(j,k)\} \]

这两个信息都可以用线段树合并维护,时间复杂度 O(n log n)

其中 g 的维护需要在 merge 的过程中一边维护,推荐找个代码看看。

M

求树上随机两条路径的交的长度的平方和。

组合意义转化为在交上选两条边的方案数和选一条边的方案数,dp 可求。

posted @ 2025-02-09 16:22  CHiSwsz  阅读(72)  评论(0编辑  收藏  举报