浅谈前缀和
引入
如果你想维护一个数据结构,有一个序列 ,每次查询 区间和(求 ),只有查询,线段树&树状数组难免有些大材小用,但是维护它效率要高,甚至要达到 。
这个东西该怎么维护呢?
我们可以创造一个序列 。
这个序列显然可以用一种递归方式定义:
这样的话每次查询只需要输出 就行了。
在输入时即可统计,不会增加太多常数。
这种创造 数组的方法叫做前缀和, 叫做对于 的前缀和。
应用
当然前缀和在区间求和应用领域极其有用,对于前缀和的求和性质,我们可以优化一些题目,比如 P1147。
[例题1] P1569 【Generic Cow Protests】
题意简述:
将数列 分成几组,每组数字和 ,求最大组数。
我们维护一个数组 表示区间 之间的最优解,我们找到两个数 ,统计 ,然后更新最优解即可,注意判断不可行情况 即可。
这个算法的时间复杂度是 的,显然会 TLE,我们该怎么优化呢?
我们发现,只有求和是可以优化的,我们就可以考虑维护一个前缀和数组, 解决求和问题,算法时间复杂度直接降到
通过这道例题我们发现前缀和真是个有用的工具,它主要用来优化区间求和问题。
[例题2] P1865 A % B Problem
题意简述:
求区间质数个数。
因为是质数我们可以尝试埃氏筛,因为是求区间质数个数,所以要 for
遍历一遍,,时间复杂度是 。
已经很接近线性了,主要是优化 部分。
我们可以维护一个序列 表示 质数个数,这个埃氏筛时即可解决。
然后求区间质数个数只需要按照前缀和方法相减即可,!,时间复杂度立刻降到 。
[例题3] P1043 数字游戏
题意简述:
给定一圈整数(一共 个),你要按顺序将其分为 个部分,各部分内的数字相加,相加所得的 个结果 后再相乘,使最终结果最大/最小。
首先对于环状的东西首先当然要破环为链。
我们设 为从 到 分成 段的最大/最小值。
我们枚举中间点 ,则转移方程如下:
- 循环处注意先枚举区间长度,要不然会有遗漏。
- 再枚举左右端点,区间 dp 套路。
- 然后枚举段数用来更新。
- 最后枚举中间点 。
大约时间复杂度是 ,跑不满的。
[例题4]P2969 [USACO09DEC]Music Notes S
题意简述:
给定序列 ,有序列 :,,,,询问 次 。
这个维护一个前缀和标记极值,然后 upper_bound
即可解决,很简单。
时间复杂度大概是 。
总结
前缀和主要应用于优化区间求和,对于形如 的柿子可以优化到 ,做题时主要应用于 dp 的求和(虽然一般是单调队列优化)和某些区间统计问题。
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/12820815.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】