2025 贵阳 代码源 Day5 模拟赛

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 disvmax(av,disu+1),uv。这时我们考虑整条路径上高度变化情况,可以考虑到一定是一直不断的上升后等待 0 → 1 0\to 1 01 个点后一直下降,这样就考虑枚举峰值位置。

我们分别从 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,idisn,i1 才可能是峰值,否则可以发现该条路径上的峰值一定会出现在别的位置上。

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,jmax(fk,j1+rk+1li+1),rk+1li,因为要保证全部有交 r k + 1 ≥ l i r_{k+1}\ge l_i rk+1li,所以考虑单调队列优化。

接下来考虑之前排除掉的区间,按照之前的想法,我们枚举 i : = 1 → n i:=1\to n i:=1n 表示我们通过剩下的区间完成了 i i i 组,接下来考虑最长的之前排除掉的 n − i n-i ni 个区间,将这 n − i n-i ni 个区间都自成一组,答案就是 f n , i f_{n,i} fn,i 加上最长的 n − i n-i ni 个被排除掉的区间的长度总和;再剩下的直接合并到其包含的区间中的随便一组就好,不用考虑这部分。
————————————————
版权声明:本文为优快云博主「2020luke」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/luke20110105/article/details/149809654

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值