Contest7685 - 综合训练-105
题目按难度顺序排序。
C 合体
原题:P3147 [USACO16OPEN] 262144 P
思路
注意到 \(V=40\) 有点离谱,考虑设计 \(O(nV)\) 左右的算法。
不妨枚举最小值,每次消灭所有最小值。
人类智慧法:\(O(n \times (V + \log n))\)
考场上的方法。
此方法已经足以在合理的时间内通过本题。
枚举当前序列的最小值 \(i\)(注意值域为 \(V + \log_2 n\),不能只到 \(V\)),找出所有 \(i\) 的连续段。
对于每个连续段 \([l,r]\),令 \(k = r-l+1\):
- 如果连续段长度是偶数,那么把这个连续段两两合成变为 \(\frac k 2\) 个 \(i+1\)。
- 如果连续段长度是奇数,把 \([l,r]\) 这一段变为 \(\frac {k-1} 2\) 个 \(i+1\)、\(1\) 个分隔符、\(\frac {k-1} 2\) 个 \(i+1\)。可以证明,这样变换之后答案不变。且中间的一个分隔符不能接着参与合并,相当于我们消除了这一段的所有 \(i\)。
DP:\(O(n \times (V + \log n))\)
令 \(f_{i,j}\) 为区间左端点为 \(j\)、区间能合并出 \(i\) 的最小右端点位置。
转移:
使得 \(f_{i,j}\) 有值的最大 \(i\) 即为答案。
\(O(n \log n)\)
找出原序列所有连续段,把每 \(k\) 个 \(a_i\) 打包成一个二元组 \((a_i,k)\),再按照人类智慧法进行合并。
时间复杂度 \(O(n \log n)\)。
\(O(n)\)
TODO: 说是要用单调栈,但是没听懂。
A 迷宫设计
思路
注意到题目是特殊性质的最小生成树问题。
利用特殊性质优化 Kruskal。
Solution
注意到,根据 Kruskal 算法的过程,每次选边必然是一排一起选。考虑优化这个过程。
把每一维度的边按照大小排序。不难发现这对答案没有影响。
类似归并的过程,每次选择两个维度中边权小的那一个选满。
时间复杂度 \(O(n \log n)\)。
D 三角形
思路
一个没见过的点:平面上的三角形内数点也能前缀和。
然后就好了。
Solution
令 \(under_{i,j}\) 为第 \(i\) 个点和第 \(j\) 个点连成的线段下方(不包括线段上的点)的个数。可以 \(O(n^3)\) 预处理。判断点在线段哪一侧可以使用叉乘。
不难发现,每个三角形内的点的个数为三个 \(under\) 加加减减,时间复杂度 \(O(1)\)。
总时间复杂度 \(O(n^3)\)。
细节一堆
B 体育场 IV
TODO: 没有订正的欲望。
涉及到斜率优化,不懂了。
浙公网安备 33010602011771号