一.差分的定义
差分又名差分函数或差分运算,差分的结果反映了离散量之间的一种变化,是研究离散数学的一种工具。
二.差分运算
对于差分的运算,其实就是对于前缀和的逆运算。就像高等数学上,微分和积分的关系是一样的。
三.代码示例(以及思路讲解)
//一维差分
# include <iostream>
using namespace std;
const int N = 100010;
int n,m;
int a[N],b[N];
void insert(int l , int r , int c)
{
//保证只有在[l,r]范围内的数字才加上c
b[l] += c;
b[r + 1] -=c;
}
int main()
{
ios::sync_with_stdio(false);// 提高代码的运行效率
cin>>n>>m;
for (int i = 1 ; i <= n ; ++i) cin>>a[i];
//我们把原先的数据都初始为0,去插入输入的数据
for (int i = 1 ; i <= n ; ++i) insert(i , i , a[i]);
while (m --) //插入操作遍历m次
{
int l , r , c;
cin>>l>>r>>c;
insert(l , r , c);
}
for (int i = 1 ; i <= n ; ++i) b[i] += b[i - 1] //这是一个推导公式
for (int i = 1 ; i <= n ; ++i) cout<<b[i]<<"\n";
return 0;
}
四.二维差分(思想类同于二维前缀和)
# include <iostream>
using namespace std;
const int N = 1010;
int n,m,q;
int a[N][N],s[N][N];
//核心代码部分
void insert (int x1 , int y1, int x2, int y2, int c)
{
// 保证只在[x1][y1]~[x2][y2]范围内加上c
s[x1][y1] += c;
s[x2 + 1][y1] -= c;
s[x1][y2 + 1] -= c;
s[x2 + 1][y2 + 1] += c;
}
int main()
{
ios::sync_with_stdio(false); //提高代码的运行效率
cin>>n>>m>>q;
for (int i = 1 ; i <= n ; ++i)
for (int j = 1 ; j <= m ; ++j)
cin>>a[i][j];
for (int i = 1 ; i <= n ; ++i)
for (int j = 1 ; j <= m ; ++j)
insert(i , j , i , j , a[i][j]);
while(q -- ) //循环遍历q次
{
int x1,y1,x2,y2,c;
cin>>x1>>y1>>x2>>y2>>c;
insert(x1 , y1 , x2 , y2 , c);
}
for (int i = 1 ; i <= n ; ++i)
for (int j = 1 ; j <= m ; ++j)
s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
//格式一般要求
for (int i = 1 ; i <= n ; ++i)
{
for (int j = 1 ; j <= m ; ++j)
cout<<s[i][j]<<" ";
cout<<"\n";
}
/*格式严格要求
for (int i = 1 ; i <= n ; ++i)
{
for (int j = 1 ; j <= m - 1 ; ++j)
cout<<s[i][j]<<" ";
cout<<s[i][m]<<"\n";
}
*/
return 0;
}