才打了 \(200 \ pts\),退步了。
传送门
\[\rm 【LGR-096】洛谷~11~月月赛~I~\]
Prob A. Addition (Statement)
有一个初始长度为 \(n\) 的序列 \(a\)。你需要进行 \(n − 1\) 次操作。每一次操作先选出两个相
邻的数 \(x, y\) 并删掉(原序列中 \(x\) 在 \(y\) 左边),再往原位置插入一个 \(x + y\) 或一个 \(x − y\)。求
\(n − 1\) 次操作之后能最终剩下的数的最大值。\(1 ≤ n ≤ 10^5\), \(|ai| ≤ 10^9\)。
分值 | \(n\) | \(abs(a_i)\) | 特殊性质 | |
\(Subtask\ 1\) | \(10\) | \(\leq 2\) | 无特殊限制 | 无 |
\(Subtask\ 2\) | \(20\) | \(\leq100\) | 无特殊限制 | 无 |
\(Subtask\ 3\) | \(5\) | 无特殊限制 | 无特殊限制 | \(a_i \ge 0\) |
\(Subtask\ 4\) | \(30\) | 无特殊限制 | \(\leq 1\) | 无 |
\(Subtask\ 5\) | \(35\) | 无特殊限制 | 无特殊限制 | 无 |
Subtask 1
输出 \(\max(a_1 + a_2, a_1 − a_2)\)。期望得分 \(10\) 分。
Subtask 2
区间 dp
,\(f_{l,r}, g_{l,r}\) 表示只考虑 \([l, r]\) 时的最大/最小答案。
枚举 \(i\) 表示最后一次合并的位置,容易得出转移方程式:
$$f_{l,r} = \max\limits_{i-1}^{r-1}{f_{l,i} + f_{i+1,r}, f_{l,i} − g_{i+1,r}}$$
$$g_{l,r} = \min\limits_{i-1}^{r-1}{g_{l,i} + g_{i+1,r}, g_{l,i} − f_{i+1,r}}$$
时间复杂度 \(\mathcal{O}(n^3)\)。期望得分 \(30\) 分。
Subtask 3
输出 \(\sum\limits_{i=1}^{n}a_i\)。期望得分 \(5\) 分。
Subtask 4
输出 \(a_1 + \sum\limits_{i=2}^{n}|ai|\)。
依次加入每一个数,假设当前答案是 \(x\),新加入的数是 \(w\)。
如果 \(w < 0\) 则 \(x− = w\)。否则 \(x+ = w\)。
显然这样可以得到最大答案。时间复杂度 \(\mathcal{O}(n)\)。
Prob B. Lines (Statement)
平面直角坐标系中有 \(n\) 条直线,任意 \(3\) 条直线不交于一点且没有两条直线重合。现在
这些直线形成了不超过 \(\frac{n(n − 1)}{2}\) 个交点,请你求出至少选取其中几条直线才能覆盖到所
有交点。\(1 ≤ n ≤ 10^5, |a|, |b|, |c| ≤ 10^9\)。
分值 | \(n\) | 特殊性质 | |
\(Subtask\ 1\) | \(10\) | \(\leq20\) | 无 |
\(Subtask\ 2\) | \(30\) | \(\leq100\) | 无 |
\(Subtask\ 3\) | \(10\) | 无特殊限制 | \(ab=0\) |
\(Subtask\ 4\) | \(50\) | 无特殊限制 | 无 |
Subtask 1
暴力枚举每一条直线是否选择,判断是否合法。期望得分 \(10\) 分。
Subtask 2
假设 \(a = 0\) 的有 \(t\) 条。输出 \(\min(t, n − t)\)。期望得分 \(10\) 分。
Subtask 3
没有删掉的直线一定是互相平行的,否则一定有至少一个交点没有被删掉。所以其实就是
要选出最多的直线使它们两两平行。
对于每一条直线暴力找出有多少条直线与它平行,取最大值即可。
时间复杂度 \(\mathcal{O}(n^2)\) 或 \(\mathcal{O}(n^2 \log n)\)。期望得分 \(40\) 分。
Subtask 4
对斜率排序或用 map
统计。时间复杂度 \(O(n \log n)\)。期望得分 \(100\) 分。
C. ABC (Statement)
给定一个长度为 \(n\) 的只包含 A, B, C
的字符串 \(S\),你可以进行若干次操作,每次操作为:
- 先选择一个区间 \([l, r]\),你需要保证 \(1 ≤ l ≤ r ≤ n\)。
- 再选择三个字符 \(pA, pB, pC \in {A, B, C}\),并将 \(S_{l...r}\) 中所有
A
变为 \(pA\),所有B
变为 \(pB\),
所有C
变为 \(pC\),\(pA\), \(pB\), \(pC\) 可以相等。
你的目标是用最小的操作数使得任意相邻两个字符不同。要求构造方案。
\(1 ≤ n ≤ 5 × 10^3\)。
Subtask 1
输出 \(0\)。期望得分 \(1\) 分。
Subtask 2
暴搜。期望得分 \(20\) 分。
Subtask 3
把所有偶数位置改为 B
。期望得分 \(10\) 分。
Subtask 4 ∼ 6
假设 \(a_i = a_{i+1}\) 的位置个数为t,显然答案 \(\ge \left\lceil \frac{t}{2} \right\rceil\) 考虑构造方案达到这个下界。
对于每一个 \(a_i = a_{i+1}\) 的位置在 \(i\) 与 \(i + 1\) 之间切一刀,最终将序列分出 \(t + 1\) 段。
对于所有编号为偶数的段执行一次 \(pA =\) B
, $pB = $ C
, $pC = $ A
的操作。
因此操作次数是 \(\left\lfloor \frac{t+1}{2} \right\rfloor= \left\lceil \frac{t}{2} \right\rceil\),达到下界,正确性显然。
时间复杂度 \(\mathcal{O}(n)\)。期望得分 \(100\) 分。
D. Permutation (Statement)
对于一个 \(1 \sim n\) 的排列 \(p\),定义 \(G_p\) 为使用以下方法构造出来的无向图:
- 对于每一个 \(i \in (1, n]\),找到最大的 \(j \in [1, i)\) 满足 \(p_i > p_j\),然后连一条 \(i, j\) 之间的边,
如果不存在这样的 \(j\) 则不连。
给定一棵有 \(n\) 个节点的树T。把 \(p\) 称为好排列当且仅当 \(G_p\) 与 \(T\) 同构。如果存在好排
列,输出其中字典序最大的一个。否则输出 \(−1\)。\(1 ≤ n ≤ 5 × 10^3\)。
分值 | \(n\) | 特殊性质 | |
\(Subtask\ 1\) | \(15\) | \(\leq 8\) | 无 |
\(Subtask\ 2\) | \(5\) | 无特殊限制 | 树退化为一条链 |
\(Subtask\ 3\) | \(15\) | 无特殊限制 | 度数 \(≥ 3\) 的节点个数 \(≤ 1\) |
\(Subtask\ 4\) | \(20\) | \(\leq 100\) | 无 |
\(Subtask\ 5\) | \(20\) | \(\leq 10^3\) | 无 |
\(Subtask\ 6\) | \(25\) | 无特殊限制 | 无 |
Subtask 1
暴力枚举排列,构造树,判断同构。期望得分 \(15\) 分。
Subtask 2
\(ans_1 = 1, ans_2 = n, \forall i \in (2, n], ans_i = i − 1\)。期望得分 \(5\) 分。
Subtask 3
设每一条链的长度为 \(a_{1...m}\)。不妨 \(\forall i \in [1, m), a_i ≤ a_{i+1}\)。
\(ans_1 = 1, ans_2 = n, \forall i \in (2, a_i + 1], ans_i = i − 1\)。
依次考虑 \(j = 2 \sim m\)。对于一个 \(j\),假设 \(x = \sum\limits_{k=2}^{j} a_k\)。
依次往 \(ans\) 中加入 \(n − x \sim n − x + a_j − 1\)。期望得分 \(20\) 分。
Subtask 4 ∼ 5
先枚举根。令 \(f_u\) 表示 \(u\) 这棵子树可以对应到的字典序最大的答案,\(w_u\) 表示 \(u\) 对应的 \(p\) 值,
\(size_u\) 表示 \(u\) 子树的大小。
结论
每一棵子树在 \(p\) 中的下标一定对应一段区间。
证明:
如果不是,假设 \(v\) 不在 \(u\) 的子树中但是插在了 \(u\) 的子树的中间。
此时一定有 \(w_u > w_v\),否则 \(v\) 就是 \(u\) 子树中的点了。
但是出现在 \(v\) 之后第一个本应在 \(u\) 子树中的点一定不能连到 \(u\) 的子树中,矛盾。
我们考虑计算出每一个 \(f_u\)。假设所有 \(v \in son_u\) 的 \(f_v\) 都已经计算好了。
首先 \(f_{u,1} = 1\),否则一定不是一棵树。
把所有 \(v \in son_u\) 的 \(f_v\) 按 \(|f_v|\) 第一关键字从小到大, \(f_v\) 字典序第二关键字从大到小排序。
然后把所有 \(f_v\) 依次插入 \(f_u\)。容易发现这样可以使得 \(f_u\) 字典序最大。
时间复杂度 \(\mathcal{O}(n^3)\) 或 \(\mathcal{O}(n^3 log n)\)。期望得分 \(35 \sim 55\) 分。
Subtask 5 ∼ 6
上面直接枚举根暴力太慢了,我们可以考虑换根。
设 \(g_u\) 为 \(u\) 的外子树的字典序最大的答案。
那么从 \(g_u\) 转移到某个儿子只需要按之前的排序方法找到 \(g_u\) 在 \(v \in son_u\) 的 \(f_v\) 中位置即可。
时间复杂度 \(\mathcal{O}(n^2)\) 或 \(\mathcal{O}(n^2 log n)\)。期望得分 \(55 \sim 100\) 分。