算法差分详解 + 总结

文章目录

  • 差分
  • 一维差分
    • 题解
    • 代码
  • 二维差分

差分

区间修改时使用差分
1. 先预处理一个差分数组,cre[i] = a[i] - a[i-1],对差分数组求前缀和可以还原为原数组
2. 如果要让区间内的数+d,比如[l,r]内+d,那么r+1区间-d可以达到这样的效果,原数组[l,r]区间就+d了,只需要让差分数组第一个数加d,前缀和后后面的数都加上了d,所以让r+1以及后面的数-d,恢复原来的情况

举个例子

原数组: 1 2 2 1 2 1
差分数组: 1 1 0 -1 1 -1[1,3]区间+1
修改差分数组: 2 1 0 -2 1 -1
前缀和差分数组: 2 3 3 1 2 1

一维差分

题目链接
算法差分详解 + 总结_第1张图片

题解

1. 先预处理一个差分数组,对差分数组,区间[l,r]修改,l下标的数加上d,r+1下标的数减去d,[l,r]区间就加上了d,最后求下前缀和数组就达到了修改原数组的目的

代码

#include 
using namespace std;

const int N = 2e5 + 10;
int a[N];
int cre[N];
int pre[N];

int main()
{
  int n,m;
  cin >> n >> m;
  
  for(int i = 1;i <= n;i++) cin >> a[i];

  for(int i = 1;i <= n;i++)
  {
    // 差分数组
    cre[i] = a[i] - a[i-1];
  }

  while(m--)
  {
    int l,r,d;
    cin >> l >> r >> d;
    cre[l] += d;
    cre[r+1] -= d;  
  }
  for(int i = 1;i <= n;i++)
  {
    // 对差分数组求前缀和
    pre[i] = pre[i-1] + cre[i];
  }
  for(int i = 1;i <= n;i++) cout << pre[i] << " ";
  cout << '\n';

  return 0;
}

二维差分

算法差分详解 + 总结_第2张图片

你可能感兴趣的:(算法)