NOIP2024集训Day47 生成树+二分图

NOIP2024集训Day47 生成树+二分图


B. [THUPC2022 初赛] 最小公倍树

直接建边显然不行,考虑优化建边。

对于两个点 \(u\)\(v\)\((u, v)\) 的边权为 \(\displaystyle\operatorname{lcm}(u, v) = \frac{u\times v}{\gcd(u, v)}\),显然应该选择 \(\gcd(u, v)\) 尽可能大的点对连边,也就是说 \(u, v\) 的公因子越多越好。

由于 \(L,R\le 10^6\),可以考虑枚举这个公因子。对于因子 \(x\),如果 \(kx\)\([L, R]\) 中,则 \((k + 1)x\)\((k + 2)x\)\(\dots\),这些点向 \(kx\) 连边是比较优的。所以我们可以找到这个最小的 \(kx\) 作为起点连边。最后跑 Kruskal 即可。

这个建边的套路要记住。


C. [CF1120D] Power Tree

很巧妙的一种方法。

首先我们可以把叶子节点按 dfs 序抽象成一个序列,不妨设这个序列长 \(k\)

那么控制一棵子树内的叶子节点的点权等同于控制序列一段区间的点权。

全体置零的要求和区间加的操作容易联想到差分数组,不妨设差分数组 \(b_i = a_i - a_{i - 1}, a_0 = 0\)

对于操作区间 \([l, r]\)\(x\),就可以看作是 \(b_l\)\(x\)\(b_{r + 1}\)\(x\),那么我们就得新建出一个虚点 \(k + 1\)

对于要求全体置零,就可以看做是要求 \(\forall i\in[1,k],b_i=0\)

发现每次操作后差分数组的总和不会变,所以为了达到要求,必须把所有的值转移到 \(b_{k + 1}\) 上去。

对于操作区间 \([l, r]\)\(x\),我们可以连边 \((l, r + 1)\),边权为 \(x\)

不难发现当且仅当两个点联通时,才能把一个点的 \(b\) 值转移到另一个点上去,且代价为边权和。

所以题目的要求就是所有的点都要和 \(k + 1\) 联通,然后问最小代价。

那么这就是一个最小生成树能解决的事情了。

至于输出所有可能在最优方案中的点,也就是输出所有可能出现在最小生成树中的边,可以直接在 Kruskal 的过程中判断一下就好了。


H. [BZOJ4808] 马

首先将棋盘 \(01\) 间隔染色,然后就成了二分图

由于要放最多的马,其实就是最大独立集(最大独立集 = 点数 - 最小点覆盖 = 点数 - 最大匹配)。

[l,r]:

posted @ 2024-10-08 21:48  Leirt_Abu  阅读(27)  评论(3)    收藏  举报