前缀和基本模型:
给定一序列n,求从区间[x,y]内数字的和;
做法:
1.预处理序列
2.s[x—y]=s[y]-s[x-1];//
注意s[n]当中包括了a[n]
for(i=1;i<=n;i++){
s[i]=s[i-1]+a[n];
}//预处理
for(i=1;i<=m;i++){
scanf("%d%d",&x,&y);
printf("%d",s[y]-s[x-1]);
}
差分基本模型:
给定一段序列,让区间[x,y]中数字加上k,操作m次,求在操作后序列的某个值
a[0]=0; for(i=1;i<=n;i++){ s[i]=a[i]-a[i-1]; } for(i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&k); s[x]+=k; s[y+1]=-k;
}
for(j=1;j<=x;j++){
sum+=s[j];
printf("%d",sum);
}
差异性:
前缀和;对已给定序列中[x,y]区间进行求和;
差分;对已知序列进行加减一数的操作,求操作后序列某个数;
统一性:
差分将已给区间的数进行转化b[n]存a[n]-a[n-1]的值
于是将求原来区间
某个数转化为求b[n]的前缀和,大大减小时间复杂度,从n^2变为2n;