CF1858D Trees and Segments

原题

翻译

这题预期说是dp,不如说是预处理吧233

首先我们同时考虑两维限制是很困难的,如果我们想直接dp要设很多状态,复杂度爆炸

因此我们考虑暴力枚举一维。具体的,我们枚举把[l,r]内的所有数染成0,我们可以通过前缀和得到操作次数t(即为区间内1的个数),然后我们只需要考虑从[1,l)(r,n]中选一段区间,用Kt次操作把他染成全1,使得区间长度最大。

于是我们设prei,j表示i作为右端点,可以使用j次操作,能染成全1的最大长度。同理,设sufi,j表示i作为区间左端点,用j次全1的最大长度。可以发现左端点单增,因此我们可以尺取O(n2)解决问题

在预处理出pre,suf数组后,我们对他做一个前缀后缀最大值即可:

(1)prei,j=max(prei1,j,rl+1)(2)sufi,j=max(sufi+1,j,rl+1)

有些人就会有疑问:外面不还要再枚举a的值吗,这样做不就成了O(n3)的了吗

但我们发现,我们每次只需要知道最长0=i时的最大max(prel1tK,sufr+1tK),因此我们可以先用一个数组ansi表示最长0段长为i时最长1段长度。处理完ans后再在外面枚举a的值,答案即为maxi=0ni×a+ansi

最终复杂度$O(n^2)

posted @   FOX_konata  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示