应该是最近质量最高的模拟赛了!
T1 轻松的音乐
题意
数轴上有 个位置,在位置 上可以覆盖位置 或者 ,如果最后位置 没有被覆盖则会产生 的代价,最小化代价和,并输出这个代价。
题解
关键点:我们把未被覆盖的 看做是用 的代价覆盖了 这个点,那么我们从左到右依次决策,覆盖就变成了一个前缀!
于是就令 表示我已经决策了前 个位置的覆盖,且覆盖了前缀 的最小代价,转移大概长这样:
- 向右覆盖:。
- 向左覆盖:枚举这个前缀由 往右覆盖组成,。
- 覆盖自己:,。
每次转移完要取后缀 ,这样我们得到了 的做法。显然只有 的状态是有用的,就 了。
但是我连 都没想出来,唉,还是菜了啊!
T3 最小生成树
题意
个点的图,编号为 ,一共有两类边 :
-
条边,小 Y 会给你 个整数, , 其中 表示 号节点与 号节点有一条边权为 的边;
-
条边,连接 () ,长度为 。
次修改,每次给出两个数 , 表示将 改为 ,然后你需要输出最小生成树大小。
题解
首先我们假定二类边是联通的,如果不连通就加入 边,那么二类边显然只有 MST 有用。
进一步地,我们考虑对这个图做 Kruskal 的过程,其实可以只维护 的连通性,并记录每个连通块是否与 相连,就可以判断某条边是否需要被加入了。换句话来讲,我们只关心二类边的 Kruskal 重构树,只要这个一样那么整个图的 MST 就一样。
那么我们直接把二类边替换成一条 Kruskal 重构树与其一致的链(具体地,对二类边跑一遍 Kruskal,合并两个连通块时将其链首尾相接),问题就变成了:将链划分成若干区间,区间内链上的边连满,还得选出一条边连 ,求最小代价。
这个就直接记 表示考虑了前 个点,前面的连通块都连 了,第 个点所在的连通块有/没有连 的最小代价,然后动态 DP 了。