前言
小课堂这次讲的前缀和 和 差分,听得比较懂,所以才可以来记录一下。前缀和 和 差分数组是互逆的。
一、前缀和
前缀和就是从1开始到第i个数的和
优点是可以用前缀和来快速求解一个区间的和
for(int i=1;i<=n;i++)
{
cin>>a[i];
s[i]=s[i-1]+a[i];
}
二、差分
差分的话就是可以分为一维的差分和二维的差分
一维差分
给你一串一维数组,然后让你在l,r的区间上的每一个数字都加上x,但是这个操作只给你O(n)的时间范围才可以,请问你会怎么做呀?
那么操作就是
再开一个差分数组,在l上加上x,在r+1上减去x,然后输出每个值的时候a[i]=a[i]+a[i-1]
二维差分
那么二维差分就是会有(x1,y1),(x2,y2),那么就是(x1,y1)(x1+1,y1+1)加上x,(x1,y2+1)(x2+1,y1)减去x
接下来就是例题啦!
地毯
#include<bits/stdc++.h>
using namespace std;
int a[1005][1005];
int main() {
int n,m;
int x1,x2,y1,y2;
cin>>n>>m;
while(m--){
cin>>x1>>y1>>x2>>y2;
a[x1][y1]++;
a[x1][y2+1]--;
a[x2+1][y1]--;
a[x2+1][y2+1]++;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
cout<<a[i][j];
if(j!=n){
cout<<" ";
}
}
cout<<endl;
}
return 0;
}
总结
That’s all for it!