CCF在CSP卡常我是没想到的
一眼DP,尝试设fi表示前i个的最大价值,假设在i前面第一个涂与i相同颜色的方块是j,就会发现[j+1,i−1]的价值没办法确定,主要是j+1的价值没办法确定。此时的情形是j和j+1的颜色不同,于是可以加维设f[i][0/1]表示前i个的最大价值,其中i和i−1的颜色相同/不同,于是有
,其中val(i,j)表示[i−1,j]是相同颜色,[i,j]的总贡献.这个用前缀和处理就好了,即val(i,j)=sumj−sumi−1,于是有
对于这个式子,不难以a[i]为下标建立线段树找最大值,然后实现O(TnlogV)的复杂度 可惜,CCF这次卡常,而且我优化不掉,于是只能使用其他技巧 想一下,我们现在要干的事是找出[1,a[i]−1]和[a[i]+1,V]中的最大值,以及a[i]的DP值加上a[i].如果我们直接找[1,V]的最大值,那么显然那可以O(1)时间,但是如果找出来的地方是a[i]呢?其实不影响,因为此时一定有f[j+1][1]−sumj+1+a[i]>f[j+1][1]−sumj+1
这个优化以前没见过,的确可以看一下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构