NOIP2025 加训
CF1610E AmShZ and G.O.A.T.
最少删除元素个数转化为最多保留元素个数。考虑不合法序列的性质。
发现严格大于平均数的元素个数与严格小于平均数元素个数的关系可以与该序列中点位置的数联系在一起,显然的,对于 \(\{c_k\}\),该序列是不合法的,则有 \(c_{\left \lceil \frac{k}{2} \right \rceil} > \frac{\sum c_i}{k}\)。
考虑更简化的情况,对于 \(k = 1,2\) 的情况,序列一定是好的。
对于 \(k = 3\),据上式可得 \(2 \cdot c_2 > c_1 + c_3\) 等价于该序列是坏的。
此处存在一个结论:一个序列是好的,充要条件是不存在长度为 \(3\) 的子序列是不合法的。必要性显然,考虑其是否充分,对于一个不合法的序列,若其不存在长度为 \(3\) 的不合法子序列,则 \(\forall i,c_i + c_{k - i + 1} \ge 2 \cdot c_{\left \lceil \frac{k}{2} \right \rceil}\),对其求和有 \(\sum\limits_{i = 1}^{k} c_i + c_{k - i + 1} \ge c_{\left \lceil \frac{k}{2} \right \rceil} \cdot 2k\),化简式子得到 \(c_{\left \lceil \frac{k}{2} \right \rceil} \le \frac{\sum c_i}{k}\),因为该序列是不合法的,所以应有 \(c_{\left \lceil \frac{k}{2} \right \rceil} > \frac{\sum c_i}{k}\),矛盾。
得证一个不合法的序列一定存在长度为 \(3\) 的不合法子序列,故一个坏的序列一定存在长度为 \(3\) 的不合法子序列,反之若不存在长度为 \(3\) 的不合法子序列,该序列一定不是坏的,即是好的。充要性得证。
所以判断当前序列是否是好的,只需要检查是否存在长度为 \(3\) 的子序列不合法即可。
贪心地去考虑,每次钦定最终序列的最小值 \(mn\),将原序列最大值加入,令其为 \(p\),此时只需要找到最大的 \(mn \le c_i \le \frac{mn + p}{2}\),则可以将 \(c_i\) 加入,并令 \(p = c_i\),重复该二分过程,这样构造出的答案一定不劣。另外还能注意到仅每次枚举的最小值能够多次出现,不然会不合法。
时间复杂度 \(\mathcal{O(n \log V \log n)}\),因为每次加入 \(c_i\) 更新后 \(p\) 至少减半,存在一只 \(\log V\)。
CF1993D Med-imize
求最大中位数显然具有单调性,二分答案 \(x\),考虑如何 check。
首先经典套路可以将 \(\ge x\) 的数令为 \(1\),将 \(< x\) 的数令为 \(-1\),只要保证最终序列的和 \(> 0\) 即 \(x\) 能够成为答案。
每次删去的都是原序列的一个长度为 \(k\) 的子段,容易发现,最终仅会留下 \((n - 1) \bmod k + 1\) 个数,进一步思考,发现第 \(i\) 个数要么被删去,要么留下并且仅能成为最终序列的第 \((i - 1) \bmod k + 1\) 个元素。那么可以令 \(f_i\) 表示当前选到最终序列的第 \(i\) 个元素的和的最大值。
做完了。
CF484E Sign on Fence
离散化,二分加主席树或者整体二分加线段树解决,维护最长连续段 1 的长度。
感觉前者好写一点,就写主席树了。
又要败了吗。
CF2063F2 Counting Is Not Fun (Hard Version)
合法括号序列数量可以想到 Catalan 数。\(C_n = \frac{\binom{2n}{n}}{n + 1}\)。
每确定了一对括号,等价于将原序列分为了内外两段,考虑计算它们的长度并将它们的答案相乘起来,即每次答案的变化。F1 中可以直接 \(\mathcal{O(n^2)}\) 暴力实现。
考虑 F2 怎么做,最后确定完 \(n\) 对括号后序列是一定的,方案数是 \(1\),可以时光倒流,根据括号包含情况建出一棵树。在 F1 的暴力中会找到当前这对括号包含的第一层括号,以及包含当前括号的第一对括号。那么树建出后,一个点的贡献即 \(r_u - l_u + 1 - \sum\limits_{v \in son_u} (r_v - l_v + 1) - 2\)。
可以使用并查集维护这个倒着做的过程,先记录下包含自己的那对括号,即自己的父亲,删除一对确定的括号,等价于合并该点与其父亲,把儿子全部连到父亲上来。然后就做完了。
CF2063E Triangle Tree
把不知道多久以前的 div.2 补完了。拆一下贡献,dsu on tree 使用树状数组维护一下树上深度的两种情况。做完了。
CF2063D Game With Triangles
反贪太烂了。当时赛时也不会。跟上题是一场的。
注意到每次会使用一边的最远的一对点以及另一边的某一个点,发现另一边取的这个点是谁并不重要,考虑记录当前剩下的两边的点的个数,先将两边的最优点对的答案先存下,优先队列维护。思考每次如何反悔,当且仅当有一边没有点而另一边还有 \(\ge 2\) 个点时可以考虑反悔,将没有点的那一边已经取得点对中最劣的拿出来重新取即可。每一次都将当前情况和以前的取 \(\max\) 即能保证正确性。
P12558 [UOI 2024] Heroes and Monsters
喵喵题。一开始还看错题了,发现怎么不太可做。
注意到每次只需要看当前英雄选入 \(S\) 或者不选入是否合法即可。显然需要将 \(\{a_i\},\{b_i\}\) 排序,可以先思考出一个 \(\mathcal{O(n^3)}\) 的做法出来。每次枚举 \(k\),再求 \(ans_k\),\(f_{i,j}\) 表示前 \(i\) 个英雄中选了 \(j\) 个到 \(S\) 中的不同集合数量。每一次贪心地去选该英雄与哪个怪物战斗最优,考虑将 \(\{b_i\}\) 分为前后两段,发现选入 \(S\) 的 \(a_i\) 一定与前一段匹配,未选入的一定与后一段匹配,贪心地去匹配,发现当前选出的 \(S\) 能够合法当且仅当 \(\forall i \in S,a_i > b_j \and \forall i \notin S,a_i < b_{k + j}\),\(j\) 表示 \(a_i\) 在/不在 \(S\) 是第 \(j\) 小的。可以得出 \(f_{i,j} = f_{i - 1,j - 1}[a_i > b_j] + f_{i - 1,j}[a_i < b_{i - j + k}]\)
然后观察 \(n^3\) 式子,发现每次 DP 十分相像,由于有分为前后两段的结论,可以前后缀 DP,再考虑合并它们得出答案。对于前缀 DP,\(f_{i,j}\) 表示前缀 \(1 \sim i\) 选了 \(j\) 个到 \(S\) 中,仅保证选入 \(S\) 中的均合法的数量,每次选的是 \(S\) 中的,那么只需要该英雄能匹配的怪物编号 \(pos \ge j\) 即可;对于后缀 DP,\(g_{i,j}\) 表示后缀 \(i \sim n\) 选了 \(j\) 个到 \(S\) 中,仅保证未选入 \(S\) 中的均合法的数量,每次选的是不在 \(S\) 中的,需要 \(n - pos \ge n - i + 1 - j\)。合并的时候的分界点需要满足左边一段未被选入 \(S\) 的英雄一定小于右边一段所有 \(b_i\),以及右边一段被选入 \(S\) 的英雄一定大于左边一段所有 \(b_i\),只需要对于每个 \(b_i\) 找到最大的小于其的 \(a_i\) 即可,该点即为分界点,双指针维护一下就做完了。
P6715 [CCO 2018] Fun Palace
喵喵喵喵喵喵喵喵题。这个状态不像是人类想出来的。
\(f_{i,j}\) 表示钦定所有生物均无法往左移动,前 \(i\) 个中第 \(i\) 位最多可以累积 \(j\) 个的最大生物放置数。因为可能单靠该点生物数量无法向左移动但会向右寻找其他生物,返回时可能就能够向左移动,所以如此钦定。特别神秘。令 \(x,y\) 分别为第 \(i,i + 1\) 位的生物数量,进行分讨。
- \(x < a_i\),若 \(y = b_i\),则 \(i + 1\) 位最多累积 \(x + b_i\) 个,\(f_{i,x + b_i} \gets f_{i - 1,x} + b_i\);
- \(x < a_i\),若 \(y < b_i\),则 \(i + 1\) 位最多累积 \(y\) 个,\(f_{i,y} \gets \max\limits_{x} \{f_{i - 1,x}\} + y\);
- \(a_i \le x < a_i + b_i\),则 \(y = 0\),最多可累积 \(x - a_i\),\(f_{i,x - a_i} \gets f_{i - 1,x}\);
- \(x \ge a_i + b_i\),则 \(y = 0\),最多可累积 \(x\),\(f_{i,x} \gets f_{i - 1,x}\)。
通过 \(e\) 可知初始状态,答案则为 \(\max\{f_{n,i}\}\)。时空复杂度均为 \(\mathcal{O(nV)}\)。

浙公网安备 33010602011771号