扩大
缩小

前缀和与差分

该随笔为基础内容,想要了解拓展知识可以点 这里

---算法简介

  问题一:有 n 个数,现在有 m 个操作,分为两种类型:

    1. 每一次要求将第 k 个数加上 a

    2. 查询第 k 个数字的值。

  1kn105

  这一题其实用一个数组就可以维护。

 

  问题二:有 n 个数,并且有 m 次操作,每一次操作要求查询第 x 个数到第 y 个数的和。

  1xyn,m107

  如果用暴力或带 log 的算法做那么肯定是会 TLE 的,需要设计一个线性复杂度的算法。

  令

S(i)=i=1nai

  那么第 x 到第 y 个数的和就是 S(y)S(x1)。 

  而 S(i)=S(i1)+ai,所以 S(1)S(n) 可以在 O(n) 的复杂度递推出来。

  对于每次询问,便可 O(1) 求出了。

 

  问题三:有已赋值的 n 个数,现在有 m 个指令,第 i 个指令要求将第 xi 个数到第 yi 个数的每个数加上 k,最后求所有数的值。

  1xiyin,m1071k109

  我们也可以用与前缀和类似的方法解决此题。

  令

f(i)=aiai1
S(i)=i=1nfi

  然后就会发现,对于 1in 的正整数 i,均有 S(i)=ai

  而当区间 [xi,yi] 被加上相同的数时,f 数组中只有 fxifyi+1 发生了改变。

  所以每次让区间 [xi,yi] 每个数加上 k 后,把 fxi 加上 kfyi+1减去 k,最后使用前缀和时这个 k 就可以覆盖整个区间而不重不漏。、

  复杂度仍为 O(n+m)。 

该随笔为基础内容,想要了解拓展知识可以点 这里

posted @   HoshizoraZ  阅读(1078)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示