# [Day 5 模拟赛](http://oj.daimayuan.top/contest/366)
## 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$ 个被排除掉的区间的长度总和;再剩下的直接合并到其包含的区间中的随便一组就好,不用考虑这部分。
2025 贵阳 代码源 Day5 模拟赛
于 2025-07-31 17:00:11 首次发布

被折叠的 条评论
为什么被折叠?



