用途
差分主要用于区间的修改,可以实现在一个区间内的数字的增减,和线段树相比具有代码量少,速度快的优点。 - -|线段树也太难了吧
实现原理
首先我们需要一个差分数组,在差分数组内保存的是这个数和前一个数的差值。所以只要修改一个数,那么他后面的数就会全部得到相同的修改。在这一性质下,如果我们要对区间[a, b]内的数全部加上c,那么只需要f[a]+b, f[b+1]-c.
The Example
solution
#include<iostream>
using namespace std;
#define N 5005000
using namespace std;
int f[N];
int a[N];
int minans = 999999999;
int main()
{
int n,p;
scanf("%d%d",&n,&p);
for (int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
f[i] = a[i] - a[i-1];
}
// build difference array
int x,y,z;
for (int i = 0; i < p; i++)
{
scanf("%d%d%d",&x,&y,&z);
f[x]+=z;
f[y+1]-=z;
}
// 进行区间的修改
int temp = 0;
for (int i = 1; i <= n; i++)
{
temp += f[i];
minans = min(minans,temp);
}
// get the ans
printf("%d",minans);
}