2025 贵阳 代码源 Day 10 模拟赛
Day 10 模拟赛
A
枚举的 \(x\) 的值,这时候就说明所有建筑的等级 \(\ge x\),且有至少一个建筑的等级 \(=x\);枚举这个等级 \(=x\) 的建筑的位置,它的价值就固定了,这时候其它所有等级 \(\ge x\) 的位置的值就可以 dp 高效求了;
B
高维前缀和板题,不过这题好像是高维后缀和,前缀和是枚举子集,后缀和就是枚举超集。发现 \(i\ \text{and}\ j= k\) 则说明 \(k\) 是 \(i,j\) 的子集,也即 \(i,j\) 是 \(k\) 的超集,这时用高维后缀和统计所有数下标为 \(k\) 的超集的最大值和最小值,然后两个数组的最大最小值排列组合分别乘起来即可。
但发现题目要求 \(i\ \text{and}\ j\ge k\) 而非严格等于,这也很简单,\(k\) 倒序枚举,每个 \(k\) 继承前面 \(k+1\) 的最大最小值即可。
C
思维题。发现 \(x\) 没有限制,说明可以为每次不同的极大值,那么我们想到对一个区间操作一次后这个区间以后就永远不会和区间外的值相同,但如果区间内有相同的值就不会改变,所以我们尽量让一次操作区间大且内部没有重复元素。考虑到假设我们把这 \(n\) 个元素分成了 \(k+1\) 个子数组,没有分漏且每个子数组内没有相同元素,我们可以不用管第一个子数组,只用修改后面的 \(k\) 个组,这时的代价就是 \(\lfloor \frac{k}{2} \rfloor+1\);这也好证明,我们每次操作连续 \(\lfloor \frac{k}{2} \rfloor+1\) 个组,总共操作 \(\lfloor \frac{k}{2} \rfloor+1\) 次,每次操作的值都是一个不同的极大值,可以发现这样就能保证每个元素不同。
解决完了如何统计答案,我们考虑如何分组。发现我们可以枚举开头子数组的长度,这样再写一个 dp 就能求出后面需要段的数量。但这样我们发现可能不是最优的,因为考虑如果最后一个组内的元素 和 第一个组内元素没有交,那么我们同时也可以不对最后一个组进行操作。这时我们在枚举开头子数组的长度的同时用双指针维护最长的后缀使得该后缀内的元素不重复且后缀内元素和开头子数组内元素没有交,我们记开头子数组长度为 \(l\),后缀的左端点下标为 \(r\)。
还记得我们前面说的 dp 求一个位置后面的最少分组,我们将其记为 \(f_i\);可以发现对于一个 \(i\) 有很多分组的可能满足 \(f_i\),但我们为了考虑后缀 \(r\) 我们考虑每个分组情况中分的最后一个组 \([lst,n]\),我们再记录一个 \(g_i\) 表示满足组数达到 \(f_i\) 的 \(\max_{lst}\)。注意要求得正确的 \(g\) 不能靠最简单的贪心,需要上一点手法。
有了这两个 dp 数组我们就能统计答案了。枚举 \(l\),双指针维护 \(r\),此时如果不考虑是否不选最后一组那么代价就是 \(\lfloor \frac{f_{l+1}}{2} \rfloor+1\);这时我们判断 \(r\) 和 \(g_{l+1}\) 的大小关系;如果 \(r> g_{l+1}\),我们就需要将最后一组 \([g_i,n]\) 再分成两组 \([g_i,r-1],[r,n]\),最后一组不用统计所以答案没有变化;反之如果 \(r\le g_{l+1}\) 则只是扩大了最后一个区间的长度,需要修改的子数组组数就是 \(f_{l+1}-1\),代价就是 \(\lfloor \frac{f_{l+1}-1}{2} \rfloor+1\),最后对答案求最小值即可。
D
先考虑 dp,发现能选就必须选,如果正着做就很难做,反而倒着转移就不难,就想到 \(f_{i,j}\) 表示后 \(i\) 个选 \(j\) 个的最小代价。转移的时候发现有些情况可选可不选,有些必须选,选的情况就是 \(f_{i,j}\gets f_{i+1,j-1}+w_i\),不选则是 \(f_{i,j}\gets f_{i+1,j},w_i>f_{i+1,j}\),复杂度 \(O(n^2)\)。
考虑优化,先考虑把 \(i\) 维滚动数组优化掉,发现两个关键性质,首先就是 \(f_j\) 随 \(j\) 递增;其次发现转移时分成两部分,\(f_j< w_i\) 和 \(f_j\ge w_i\);发现前者不用改变,而后者可以理解为所有的值先全部右移一位,即 \(f_j+w_i\to f_{j+1}\);同时设最后一个 \(f_p<w_i\) 的位置为 \(p\),则有 \(f_p+w_i\to f_{p+1}\),这个操作是对前面的右移操作的转移的补充。
分析这几个转移,发现有区间加和插入,可以想到平衡树加打标记,由于每次都是对一个后缀打标记所以不会更改相对顺序所以平衡树做法正确。