T1:假期计划
给定 \(n\) 个点 \(m\) 条边的无向图,每个点有一个点权。在图中选 \(4\) 个不同的点,从 \(1\) 号点出发完成 \(5\) 段行程:\(1 \to A \to B \to C \to D \to 1\),每段行程可以经过任意点但是最多走 \(k+1\) 条边,求满足条件的四个点的最大点权和。
算法分析
可以发现这道题 \(n \leqslant 2500\),我们可以枚举起点使用 bfs
求出任意两个点之间的最短路,如果两点之间最短路不超过 \(k+1\),那么它们就可以连续出现在行程中。
\(40\) 分做法:
由于 \(n \leqslant 20\),直接使用 \(4\) 层循环枚举 \(A\)、\(B\)、\(C\)、\(D\) 的下标,再验证是否满足要求
\(70\) 分做法:
考虑只枚举 \(A\)、\(B\)、\(C\),其实 \(D\) 的值可以使用贪心法求解,\(D\) 到 \(C\) 的距离 \(\leqslant k+1\),并且 \(D\) 到 \(1\) 号点的距离 \(\leqslant k+1\),那么 \(D\) 一定是满足条件的点中权值最大的那个。
这里需要注意的是:权值最大的点也可能是 \(A\) 或 \(B\) 中的一个,由于景点不能重复,所以我们需要选权值第二大的点,但是权值第二大的点也有可能是 \(A\) 或 \(D\) 中的一个,这种情况我们需要选择权值第三大的点。
因此我们需要预处理,对于每个点 \(i\),需要求出到 \(i\) 点和 \(1\) 号点的距离都 \(\leqslant k+1\) 的点里面,权值的第一大、第二大、第三大,然后再三重循环枚举 \(A\)、\(B\)、\(C\) 点,\(D\) 点就是 \(C\) 点的前三大点中的一个。
\(100\) 分做法:
预处理的部分还是不变,我们可以发现 \(A\) 点的性质和 \(D\) 点是非常类似的,\(A\) 点到 \(B\) 点和 \(A\) 点到 \(1\) 号点的距离都 \(\leqslant k+1\)。
我们可以只枚举 \(B\) 点和 \(C\) 点,可以发现 \(A\) 点必须是 \(B\) 点前三大点中的一个,\(D\) 点必须是 \(C\) 点前三大点中的一个(需要考虑 \(B\) 点前三大点和 \(C\) 点前三大点之间存在交集)。
时间复杂度:\(O(n^2)\) 。
T2:策略游戏
给定两个数组 \(A\) 和 \(B\),每轮在两个数组中分别规定一个区间,第一个人在 \(A\) 数组对应区间中选一个数,第二个人在 \(B\) 数组对应区间中选一个数,最终得分是两个数的乘积之和。第一个人希望得分尽可能大,第二个人希望得分尽可能小,求最优策略下,每轮游戏的得分。
算法分析
首先使用贪心法思考这个问题,如果第一个人选的数字已经确定了,那么第二个人肯定会遍历整个区间,选出其中乘积最小的对应数字。
对于第一个人来说,他选数的时候其实可以预见第二个人选的数字。
\(40\) 分做法:
直接枚举第一个人选的数字,然后遍历区间求出第二个人选的数字,实质是选每行最小值中的最大值,时间复杂度为 \(O(nmq)\) 。
当数据满足特殊性质 \(2\) 时,时间复杂度为 \(O(nq)\) 。
\(65\) 分做法:
再考虑到特殊性质 \(1\):\(A_i, B_i > 0\),不管第一个人选的数字是什么,第二个人选的数字一定是区间中最小的数字。所以,第一个人一定会选区间中最大的数。
我们可以使用 \(ST\) 表或者线段树维护 \(A\) 数组的区间最大值和 \(B\) 数组的区间最小值,然后对于满足特殊性质 \(1\) 的点,答案一定是 \(A\) 数组指定区间的最大值 \(\times\) \(B\) 数组指定区间的最小值。
\(100\) 分做法:
按照上述讨论,如果 \(A_i, B_i\) 都大于 \(0\),那么取的数字一定是区间最值。拓展上述结论会发现:如果第一个人取的是正数,第二个人一定会取区间的最小值;如果第一个人取的是负数,第二个人一定会取区间最大值。
在此基础上考虑第一个人的取值
- 如果他取正数:当第二个人取的区间最小值是正数时,第一个人应该取最大的正数;如果第二个人取的区间最小值是负数时,第一个人应该取最小的正数(或者有 \(0\) 取 \(0\));
- 如果他取负数:当第二个人取的区间最大值是正数时,第一个人应该取最大的负数;如果第二个人取的区间最小值是负数,第一个人应该取最小的负数。
综上,第一个人只会取区间中四种数中的一个:最小的负数、最大的负数、最小的非负数、最大的非负数;而第二个人只会根据第一个人取的数的符号取区间的最大值或最小值。
使用 \(ST\) 表,维护 \(A\) 数组的区间最大负数、区间最小负数、区间最大非负数、区间最小非负数,再维护 \(B\) 数组的区间最大和区间最小,然后每轮游戏只有四种方案,求出其中最大值就能得出这一轮的答案了。
时间复杂度:\(O(n\log n)\)