C++之差分入门

因为是入门,所以这篇文章只讲述了差分的原理

有这么一种题型,他让你每次在给定的区间内加上一个数,最后求最大值等,数据范围往往都很大。直接for循环肯定超时。所以这时候就要用到差分

差分原理

先有两个数组,一个是差分数组d,一个是前缀和数组s

如果我们想要把前缀和数组的l-r区间都加上一个数x,这里假设x=6,l=2,r=5,那么可以进行如下操作:

1.将d[l]+x,d[r+1]-x

    0    1    2    3    4    5    6    7

d: 0    0    6    0    0    0   -6    0

这个时候观众大佬们可能还看不出什么,但如果将d进行前缀和呢?

2.s[i]=s[i-1]+d[i]

    0    1    2    3    4    5    6    7

s: 0    0    6    6    6    6    0    0

当然,有多组区间只需要在d数组上修改,前缀和数组最后求就行

发现竟然达到了我们的需求,那么假设有n组区间,那么时间复杂度就是O(2*n+r_{max}),明显比暴力O(n*r_{max})要小很多。

懂了这个,想必一些题大家就能做了吧

给大家推荐几道题练练手:

P11853 [CSP-J2022 山东] 植树节 - 洛谷

B4106 [CSP-X2024 山东] 翻硬币 - 洛谷

P2367 语文成绩 - 洛谷

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值