2025 贵阳 代码源 Day 5 模拟赛
Day 5 模拟赛
A
枚举 \(R_1\) 和 \(L_2\) 中间分割点,相当于求前缀和后缀内最大子段和,两次枚举就求完了。
B
把丢到的最小改成选的最大。结构体存一起,按照 \(c\) 和 \(h\) 排序两次,枚举剩下 \(h\) 的上限,以按 \(c\) 排完序后的下标在线段树上加点,因为我们要尽量选 \(c\) 最大的玩偶,就在线段树上二分,保证前缀玩偶数量不超过已选的最大 \(h\) 的数量。
C
发现到达点 \(v\) 的最短时间就是 \(dis_v\gets\max(a_v,dis_u+1),u\to v\)。这时我们考虑整条路径上高度变化情况,可以考虑到一定是一直不断的上升后等待 \(0\to 1\) 个点后一直下降,这样就考虑枚举峰值位置。
我们分别从 \(1\) 和 \(n\) 开始 dijkstra 求得 \(dis_{1,i},dis_{n,i}\),枚举峰值位置,注意要判断只有 \(|dis_{1,i}-dis_{n,i}|\le1\) 才可能是峰值,否则可以发现该条路径上的峰值一定会出现在别的位置上。
D
发现一个关键性质,如果一个区间 \(l_1, r_1\) 包含 \(l_2, r_2\),则我们对 \(l_1, r_1\) 只用考虑将其添加到 \(l_2, r_2\) 同一组中或独立开成一组,这样我们就可以把所有包含其它区间的区间去除掉,只用考虑没有包含其它任何区间的区间。又发现因为这些剩下的区间肯定互不包含,所以我们将剩下的区间按左端点排序后右端点也将是有序的。
有了这两个性质之后我们就可以开始 dp 了,先只考虑剩下的区间将其排序,用 \(f_{i,j}\) 表示在前 \(i\) 个区间中已经完成了 \(j\) 组,总和是多少,转移 \(f_{i,j}\gets \max(f_{k,j-1}+r_{k+1}-l_i+1),r_{k+1}\ge l_i\),因为要保证全部有交 \(r_{k+1}\ge l_i\),所以考虑单调队列优化。
接下来考虑之前排除掉的区间,按照之前的想法,我们枚举 \(i:=1\to n\) 表示我们通过剩下的区间完成了 \(i\) 组,接下来考虑最长的之前排除掉的 \(n-i\) 个区间,将这 \(n-i\) 个区间都自成一组,答案就是 \(f_{n,i}\) 加上最长的 \(n-i\) 个被排除掉的区间的长度总和;再剩下的直接合并到其包含的区间中的随便一组就好,不用考虑这部分。

浙公网安备 33010602011771号