才打了 \(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\) 分。