Luogu5611 Ynoi2013 D2T2/牛客挑战赛32F 最大子段和 分块、分治
之前一直咕着的,因为一些特殊的原因把这道题更掉算了……
有一个对值域莫队+线段树的做法,复杂度然而牛客机子实在太慢了没有希望(Luogu上精细实现似乎可以过)。
考虑对序列进行块大小为的分块。对于某一个块来说,如果我们要对这个整块进行询问,那么一次询问一定会保留这个数按照值域排序之后的一段区间,其余都变成。也就是说本质不同的询问只有种。
如果可以对这种询问处理出每一种对应询问下这一块中的最大子段和、最大前缀和、最大后缀和和总和,那么对于一组询问就只需要把整块的信息拿过来把散块暴力合并就可以了。
注意到计算最大子段和具有结合律,我们考虑分治。当我们在解决一段区间时候,先从中间劈成和两半递归下去做,递归边界是。接下来我们考虑当我们解决了和的问题时如何合并。
首先我们可以使用归并得到当前区间按照值域排序后的数组,然后我们需要通过左右两边得到的答案来得到左右端点分别取在其中某个位置的时候的答案。假设需要求值域左右端点为的答案,那么在左区间中找到最小的的值和最大的的值,那么对于左区间来说询问等价于询问,而后者在之前处理的答案里面存在。所以我们找到就可以得到左区间的信息,右区间同理。我们可以通过这个方式来得到当前区间下的所有答案。
使用单调性将每一层合并的复杂度降低为区间长度的平方,那么分治的复杂度可以由计算,根据主定理。也就是我们将所有块的答案预处理出来的复杂度是的。
然后我们只需要对于每一次询问找到每一块内这组询问的值域区间对应在块上的哪一个区间。在线做需要二分,所以可以把询问离线下来,把所有需要求位置的所有值域位置先排序然后双指针求出对应位置。复杂度。
题外话:这东西常数贼大,尽量避免使用STL是卡常的很好的选择……
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)