差分与前缀和
前缀和
它的数学表达关系是: b[i]=a[i]+b[i-1]
图片中下面部分是b数组。
前缀和能快速处理一些问题
一些区间的问题(这时候有些问题我们就需要对许多区间进行处理这时候遍历就会非常的慢,我们就需要对其优化,这时候如果是处理某一类的问题我们就需要对一些算法进行优化
先加一个代码,然后上题,网上应该找的到答案,如果有问题,可以私我
不过我才学了几个月而且大一…嘛,能力有限,但我会努力帮忙的
for(i=1;i<=len;i++)//长度为len的数组
scanf("%d",&a[i]);
for(i=1;i<=len;i++)
s[i]=s[i-1]+a[i];
while(m--)//询问m次在l到r的区间内的所有数的和
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",s[r]-s[l-1]);
}
下面的题可以练哈
https://nanti.jisuanke.com/t/T1853
https://www.luogu.com.cn/problem/AT2412
差分
差分的数学表达式是 b[i]=a[i]-a[i-1]
for(int i=1;i<=n;i++)//输入n个数
{
scanf("%d",&a[i]);
b[i]=a[i]-a[i-1];
}
while(m--)//对m个区间进行处理
{
scanf("%d%d%d",&l,&r,&c); //l为区间的左边界,r为区间的右边界,c表示区间内的每个数加上c
b[l]+=c;
b[r+1]-=c;
}
for(int i=1;i<=n;i++)
{
a[i]=a[i-1]+b[i];
printf("%d ",a[i-1]+b[i]);
}
贴题 =-= !!!
https://www.luogu.com.cn/problem/P2367(这是一个标准的板子水题 啊!!!
https://www.luogu.com.cn/problem/CF44C