二阶前缀和和二阶差分

马上就要csps 了还啥也不会,真就是酸菜鱼了。

定义

二阶差分就是在差分数组的基础上再做一次差分。

举个很板的栗子就是对一个序列进行一个等差数列式的一个减法,这个时候我们可以通过二阶差分,在 O(1) 的复杂度进行修改,之后就是 O(n) 的二维前缀和,就可以维护出来我们的一个序列了(至于比较灵活的应用还不会,等我会了upd,或者就是等我退役了直接再等 年更新)

例题

T1

三步必杀

这个题目就是我上面说的等差数列维护就好了,很板的一道题。(

这个题目可以推出来,我们在维护二维差分数组的时候,我们进行的单点 修改应该是这样的:

c1 为修改时候的等差数列的第一项,d 为等差数列的公差,cm 为等差数列的 末项,l 为等差数列修改的左边界,r 为等差数列的右边界,d为我们的二维差分数组 。

我们修改的地方就应该为

d[l]d[l]+c1

d[l+1]d[l+1]+dc1

d[r+1]d[r+1]dcm

d[r+2]d[r+2]+e

T2

P1438

这个题目其实也是和上面的题目一样,但是我们需要考虑在修改的同时维护一个前缀和,不难想到用树状数组来进行维护(树状数组又好写,又常数小,谁不爱用呢 )。由于我们对原数组进行了差分,所以我们求一个位置的时候应该是求这个位置的二阶前缀和,然后我们在修改的时候是进行四次单点修改(修改位置同上)。下面我们就要推式子然后看我们树状数组是要维护什么:

d 为一阶差分序列,d 为二阶差分序列。

ai=j=1idi=j=1ik=1jdk=j=1i(ij+1)dj=(i+1)j=1idjj=1ij×dj

这个时候我们就知道我们需要通过树状数组维护两个东西:一个是 di的前缀和,另一个是 j×dj 的一个前缀和。

啥时候才能不用学知识的菜鱼啊


__EOF__

本文作者carp
本文链接https://www.cnblogs.com/carp-oier/p/17765322.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   carp_oier  阅读(241)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示