前缀和

84 阅读1分钟

前缀和快速应用

s[i] += s[i - 1]; //构建前缀和

使用方法:区间求和[2,5] = s[5]-s[2-1]=s[1]

二维构建

m[i][j] = m[i-1][j] + m[i][j-1] - m[i-1][j-1] + x;

s =m[x2][y2]-m[x1-1][y2]-m[x2][y1-1]+m[x1-1][y1-1];

差分数组快速应用

b[i] = s[i] - s[i - 1]; //构建差分数组

精髓是差分数组的前缀和是原数组

作用是:将一个原数组区间内的数字同时改变,对b数组求前缀和就可以了得到改变后的原数组

使用方法:对原数组[l,r]进行区间加减数操作的重点是

b[l] += c; //将序列中[l, r]之间的每个数都加上c

b[r + 1] -= c;

右边后一位要减去一个东西,因为多了

#include<iostream>
using namespace std;

int n[5] = { 0,2,5,6,3 };

int main() {


	int s[6] = { 0 };
	int b[6] = { 0 };
	for (int i = 1; i <= 5; i++) {
		cin >> s[i];
		b[i] = s[i] - s[i - 1];      //构建差分数组
	}

	for (int i = 1; i <= 5; i++)
		cout << "s[i]=" << s[i] << " ";
	puts(" ");

	int a[6] = { 0 };
	//前缀和
	for (int i = 1; i <= 5; i++) {
		a[i] = a[i - 1] + s[i];
	}

	for (int i = 1; i <= 5; i++)
		cout << "a[i]=" << a[i] << " ";
	puts(" ");
	//方法2 s[i]+=s[i-1];
	for (int i = 1; i <= 5; i++)
		s[i] += s[i - 1];

	for (int i = 1; i <= 5; i++)
		cout << "a1[i]=" << s[i] << " ";
	puts(" ");
	cout << "区间的和【2,3】=s[3]-s[2-1]=" << s[3] - s[2 - 1] << endl;


	//s数组是b数组的前缀和数组
	cout << "s数组是b数组的前缀和数组 差分数组:" << endl;
	for (int i = 1; i <= 5; i++)
		cout << "b[i]=" << b[i] << " ";
	puts(" ");

}