Day 5 模拟赛
A
枚举 R 1 R_1 R1 和 L 2 L_2 L2 中间分割点,相当于求前缀和后缀内最大子段和,两次枚举就求完了。
B
把丢到的最小改成选的最大。结构体存一起,按照 c c c 和 h h h 排序两次,枚举剩下 h h h 的上限,以按 c c c 排完序后的下标在线段树上加点,因为我们要尽量选 c c c 最大的玩偶,就在线段树上二分,保证前缀玩偶数量不超过已选的最大 h h h 的数量。
C
发现到达点 v v v 的最短时间就是 d i s v ← max ( a v , d i s u + 1 ) , u → v dis_v\gets\max(a_v,dis_u+1),u\to v disv←max(av,disu+1),u→v。这时我们考虑整条路径上高度变化情况,可以考虑到一定是一直不断的上升后等待 0 → 1 0\to 1 0→1 个点后一直下降,这样就考虑枚举峰值位置。
我们分别从 1 1 1 和 n n n 开始 dijkstra 求得 d i s 1 , i , d i s n , i dis_{1,i},dis_{n,i} dis1,i,disn,i,枚举峰值位置,注意要判断只有 ∣ d i s 1 , i − d i s n , i ∣ ≤ 1 |dis_{1,i}-dis_{n,i}|\le1 ∣dis1,i−disn,i∣≤1 才可能是峰值,否则可以发现该条路径上的峰值一定会出现在别的位置上。
D
发现一个关键性质,如果一个区间 l 1 , r 1 l_1, r_1 l1,r1 包含 l 2 , r 2 l_2, r_2 l2,r2,则我们对 l 1 , r 1 l_1, r_1 l1,r1 只用考虑将其添加到 l 2 , r 2 l_2, r_2 l2,r2 同一组中或独立开成一组,这样我们就可以把所有包含其它区间的区间去除掉,只用考虑没有包含其它任何区间的区间。又发现因为这些剩下的区间肯定互不包含,所以我们将剩下的区间按左端点排序后右端点也将是有序的。
有了这两个性质之后我们就可以开始 dp 了,先只考虑剩下的区间将其排序,用 f i , j f_{i,j} fi,j 表示在前 i i i 个区间中已经完成了 j j j 组,总和是多少,转移 f i , j ← max ( f k , j − 1 + r k + 1 − l i + 1 ) , r k + 1 ≥ l i f_{i,j}\gets \max(f_{k,j-1}+r_{k+1}-l_i+1),r_{k+1}\ge l_i fi,j←max(fk,j−1+rk+1−li+1),rk+1≥li,因为要保证全部有交 r k + 1 ≥ l i r_{k+1}\ge l_i rk+1≥li,所以考虑单调队列优化。
接下来考虑之前排除掉的区间,按照之前的想法,我们枚举
i
:
=
1
→
n
i:=1\to n
i:=1→n 表示我们通过剩下的区间完成了
i
i
i 组,接下来考虑最长的之前排除掉的
n
−
i
n-i
n−i 个区间,将这
n
−
i
n-i
n−i 个区间都自成一组,答案就是
f
n
,
i
f_{n,i}
fn,i 加上最长的
n
−
i
n-i
n−i 个被排除掉的区间的长度总和;再剩下的直接合并到其包含的区间中的随便一组就好,不用考虑这部分。
————————————————
版权声明:本文为优快云博主「2020luke」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/luke20110105/article/details/149809654
1万+

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



