**算法笔记-差分和前缀和**

算法笔记-差分和前缀和

差分
就是将数列中的每一项分别与前一项数做差,例如:

一个序列1 2 5 4 7 3,差分后得到1 1 3 -1 3 -4 -3

差分求前缀和=原序列

将原序列区间[L,R]中的元素全部+1,可以转化操作为差分序列L处+1,R+1处-1

二维情况可视作多个一维;

for(int i=1;i<=m;i++){
		cin>>x1>>y1>>x2>>y2;
		for(int j=x1;j<=x2;j++){
			a[j][y1]+=1;
			a[j][y2+1]-=1;
		}
	}

前缀和
一维前缀和:每一项+=前一项

二维前缀和:点(i,j)到原点这个矩阵所有元素的和;

二维前缀和的求法 : f[i][j]=f[i−1][j]+f[i][j−1]−f[i−1][j−1]+a[i][j];

求子矩阵的前缀和;

for(register int i = 1;i <= k;++ i)
	{
		int x1,x2,y1,y2;//x1,y1是左上角的坐标,另一对是右下角的坐标 
		cin >> x1 >> y1 >> x2 >> y2;
		cout << f[x2][y2] - f[x1 - 1][y2] - f[x2][y1 - 1] + f[x1 - 1][y1 - 1]; 
	}

猜你喜欢

转载自blog.csdn.net/Raki_J/article/details/105742207
今日推荐