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} = f_{i-1,f_{i-1,j}} \]

使得 \(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: 没有订正的欲望。

涉及到斜率优化,不懂了。

posted @ 2024-09-10 21:12  August_Light  阅读(17)  评论(0)    收藏  举报