#4806. 2026/2/11/LH笔记(前缀和+差分)
2026/2/11/LH笔记(前缀和+差分)
当前没有测试数据。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int t,n,a[N];
我现在想让你帮我计算一下a数组 下标从L到R这段范围的总和
我现在不是只查询一次,我有q次查询,q<=2e5
每一次查询我都会给你一个L和R,每一次查询你都要输出一下 区间和
我们开一个前缀和数组
s[i] 表示a数组的前i项 总和 是s[i]
s[i]=s[i-1]+a[i];
前缀和算法的作用:快速的计算区间和
我现在需要从a数组当中 选k个连续的数据
请问 这k个数据的总和 最大能多大???
我们要能够 枚举所有长度为k的区间 然后计算这些区间的 区间和
再求一个最大值就可以了
枚举定长区间
方法1:只枚举左端点,然后根据区间长度是固定的,能得到对应的右端点
方法2:先枚举第一个长度为k的区间,然后左端点和右端点 同时++就可以了
差分: 差分和前缀和是好兄弟 是互逆的运算
比如我们现在想对a数组 从L到R这段范围 进行+x的操作
如果有q次修改,q<=2e5
差分数组: c[i]=a[i]-a[i-1];
c[1]=a[1]
c[2]=a[2]-a[1]
c[3]=a[3]-a[2]
c[4]=a[4]-a[3]
如果差分数组按照以上规则定义,我们对差分数组 求一次前缀和
就可以还原回原数组了
所以我们可以利用差分数组进行快速的区间修改操作
比如我们现在想修改a数组从L到R这段范围的数据 全部加一个x
那么我们只需要修改差分数组的两个点就可以了
c[L]+=x c[R+1]-=x
差分的题目 一定是 先进行若干次区间修改操作
最后再统计答案
差分题目四步走:
1.先通过原始数组 计算出来 差分数组
2.利用差分数组 快速完成区间修改操作
3.对差分数组进行一次 求前缀和操作 还原回原数组
4.对数组统计答案
c[1]=a[1]
c[1]+c[2]=a[2]
c[1]+c[2]+c[3]=a[3]
c[1]+c[2]+c[3]+c[4]=a[4]
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]+a[i];
}
cin>>q;
while(q--){
cin>>L>>R;
cout<<s[R]-s[L-1]<<endl;
}
return 0;
}