省队集训 2021 简要题解(Day4、5、6)

Day4 T1 路径求和 (sum)

简要题意:

有一张 个点 条边的简单无向连通图,点的编号分别为 ,每条边长度均为 ,有 次询问,每次给定 ,求 定义 为点 之间的最短路径经过的边数。

题解:

显然有:

现在变成在 处求和; 也变成区间 ;这样离线出来做单点到根的链加链查(考虑深度的实际意义),这样就能做到

Day4 T2 路径计数 (count)

请见之前的图论杂题选讲。

Day4 T3 路径优化 (optimal)

我们找到 到每一个点的最短路,显然这些最短路构成一颗树。

先上结论:求出不穿过这棵树的边的 的简单路径中最短的一条即可。

必要性:假设存在一条合法的最短路穿过了这棵树的边,那么它肯定要再次穿过,那么中间的部分可以根据最短路树的性质松弛掉;充分性:显然包含了每个关键点。

我们把每个点拆成四个,连一个四边形,这样就能描述不能穿过(连转角都可以),然后跑 dij 即可。

Day5 T1 四子棋 (connectfour)

高分做法:

我们争取和程序轮流把同一列往上叠,把原图分成几个部分,这样就能获得很高的分数(我获得了 66 分,是除了满分之外最高的)。

满分做法:

下赢它就行了。我们考虑让两个 ai 对下;先后手问题可以先在旁边放一个解决;出现不同后,人为微调就行了。

Day5 T2 搭积木 (block)

首先我们可以发现一个重要的事实——我们可以从左到右、从高到低放这些积木,每块积木可以放在最右边作为新的边界——没有贡献;或者是放在之前一个曾作为边界的高度边上,贡献为

于是我们有了一个 的状压 DP。要想继续优化,就必须压缩状态;而压缩状态的同时保证无后效性的最好方法就是费用提前计算。

先从高到低排序,设 表示目前考虑到了高度 、使用了 个作为非边界的可达集合(用 bitest 维护);同时记录高度对应数量的前缀和为 ,限制条件是 ,于是有:

前半部分代表我不将当前高度作为边界;最后的答案数组就是 。复杂度 ,不可过。

优化转移:我们发现这个转移的第二部分有点类似于完全背包的形式,直接优化掉即可做到

考场上仅最后一步没想到,于是只有 40 分,tmd。

Day5 T3 背包 (pack)

这一类题目有一个非常厉害的普遍做法:

二分答案,然后把这个答案作为边界去搜索,达到上界就退出搜索。

先考虑 的情况:我们把所有类别内的元素排序,并把类别按照它的第一个元素大小来排序,然后直接爆搜加剪枝,复杂度就是对的了;广搜的话细节会非常多,但是也是对的。

然后考虑如何转化为 的情况,我们考虑找到只有一个类型不是选前 个的方案总前 大的,这个也可以二分,然后每个类型分别做;然后我们发现问题就转化为了 的情况。

我是这题的 AHSFNU OJ 最有解啦啦啦。

Day6 T1 消失的序列・改 (stacktwo)

易得:序列合法当且仅当不存在 使得 。设 表示长度为 的合法序列的个数。如果我们第一个位置放了 ,那么显然我们得先把 都紧接着放下来,因为如果先放了其他的,那么一定会冲突。于是可以得到:

然后我们直接从左向右扫描,找到第一个起飞的位置,并把答案加上这样一个数:

是右手边的系数,这个简单,递归计算即可;关键是如何求这个 。注意到:

我们只需付出 的时间;这是符合启发式分裂的式子的(把过程看作是一次递归,每一次的代价刚好是小的那一边)。

Day6 T2 异或矩阵 (matrix)

不会

Day6 T3 露营 (camp)

直接退火即可获得 60 分。