2026.9.5 考试总结

考试总结

100 + 100 + 0 + 50 rk2

好久没写过了。被 ljx 诈去写 t4 发现 t3 十分简单。

T2

原题:Velepin and Marketing

这里题面依照考试题面。

\(n\) 个数的数组 \(a\)\(q\) 次询问每次把 \(n\) 个数划分成 \(k\) 个集合,若 \(i\) 在集合中且集合大小 \(\ge a_i\) 那么产生 \(1\) 的贡献,问贡献最大值。

这道题主要在于性质。首先,我们把 \(a\) 从小到大排序,那么有贡献的一定是一个前缀,因为如果不是,假设贡献的为 \(a_k\),那么把 \(a_{k - 1}\) 换到 \(a_k\) 的位置,那么由于 \(a_{k - 1} \le a_k\) 所以也一定会产生贡献,一直这样换直到换不了弄出来的就是一个前缀,所以前缀是不劣的。我们考虑计算 \(f_i\) 表示前 \(i\) 个全部产生贡献会有至多有多少个单独的集合,那么 \(k_i \le f_i\) 全部都会产生贡献,因为将集合合并之后两个集合原来有贡献的都会有贡献。现在考虑求 \(f_i\),我们设 \(dp_i\) 表示前 \(i\) 个全有贡献且前 \(i\) 个最多能划分成多少个集合,显然有 \(f_i = dp_i + n - i\),加 \(n - i\) 应为 \((i, n]\) 的数都可以单独成一个集合。现在考虑求 \(f_i\),观察到对于一个集合,其最大元素为 \(a_i\) 那么其大小至少为 \(a_i\),那么有:

\[f_i = \max_{j = 1} ^ {i - a_i} f_j + 1 \]

前缀最小值数组可以优化到 \(O(n)\)。做完了。

code

T3

原题:Array Game

先考虑 \(q = 1\),设 \(dp_i\) 表示第 \(i\) 个位置是否先手必胜,当 \(\exist j \in (i, \min(r, i + m)] \land dp_j = 0\) 时必胜即 \(dp_i = 1\),否则只能不动一直拖,此时 \(dp_i = (a_i - 1) \bmod 2\)。所以我们的答案其实之和每个位置的奇偶性有关,具体的值不重要。由于有修改有区间查询,我们考虑线段树。由于 \(m\) 很小,我们记录若 \([r + 1, r + m]\) 的 dp 状态为 \(s\) 那么 \([l + 1, l + m]\) 应该的 \(s\)\(n \log n 2 ^ m\),但是我们并不需要知道许多的 \(s\) 只需要知道第一个 \(0\) 的位置,那么可以弄得只剩 \(m\) 个状态做到 \(n m \log n\)。对于区间修改,每个线段树记录 \(dp_0\)\(dp_1\) 表示是否经过区间反转后的答案,每次修改的 \(d\) 若为偶数没影响,奇数则交换 \(dp_0\)\(dp_1\) 即可。做完了。

10 年前的 code

T4

打死想不到主席树优化建边。

原题:Make Adjacent

考虑每个数字的相对位置关系,设数字 \(i\) 左边的位置为 \(l_i\)\(r_i\),那么对于 \(i\)\(j\),若两者有嵌套关系,那么最终答案两者的顺序不会影响操作次数,但如果有 \(l_i < l_j \land r_i < r_j\) 的偏序关系,那么最后 \(i\)\(j\) 显然操作次数更少。我们将这样要先 \(i\)\(j\)\((i, j)\) 建一条 \(i \rightarrow j\) 的边,然后跑拓扑排序来求出答案序列。由于要求字典序最小,我们只需把拓扑排序的队列换成优先队列即可。

暴力枚举建边可以做到 \(O(n ^ 2 + n \log n)\) 的,考虑优化。我们发现瓶颈就是建边,我们考虑优化建边的过程。我们将 \(i\) 按照 \(l_i\) 排序,那么前面出现过的 \(r_j < r_i\) 显然都要建一条边,当我们没有 \(l\) 的限制,只是 \(r_i < r_j\) 的限制时,我们不难想到用线段树优化建边。那么加上了 \(l\) 的第一维的限制为什么不行了?因为如果排序后直接枚举 \(i\) 然后让区间 \([1, r_i - 1]\) 向他连边,区间中的点可能存在 \(l_j > l_i\),因为最开始线段树建树的时候就已经将所有的点加了进去。那我们只需要枚举到 \(i\) 然后再将 \(i\) 加进去即可,我们发现这个类似主席树,直接主席树优化建边即可。

注意一些细节,拓扑的优先队列应优先便利主席树上的点否则可能答案不优。做完了。

code

posted @ 2026-09-06 14:21  ACehomoxue  阅读(10)  评论(0)    收藏  举报