当前位置:   article > 正文

12:二维差分_二维差分公式

二维差分公式

原数组p[N][N]

前缀和数组s[N][N]

二维前缀和公式:

s[i][j] = p[i][j] + s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1]

差分数组:q[N][N]

二维差分公式:

将(x1, y1) (x2,y2) 围成的矩阵内的所有数加上 x

q[x1][x2] += x; q[x2 + 1][y2 + 1] += x;

q[x2 + 1][y1] -= x; q[x1][y2 + 1] -= x;

例题链接

  1. //例题代码
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. const int N = 1e3 + 5;
  5. int n, m, q;
  6. int s[N][N], p[N][N];
  7. void insert(int x1, int y1, int x2, int y2, int num)
  8. {
  9. p[x1][y1] += num; p[x2 + 1][y2 + 1] += num;
  10. p[x2 + 1][y1] -= num; p[x1][y2 + 1] -= num;
  11. }
  12. int main()
  13. {
  14. scanf("%d %d %d", &n, &m, &q);
  15. for(int i = 1; i <= n; i ++)
  16. {
  17. for(int j = 1; j <= m; j ++)
  18. {
  19. int num;
  20. scanf("%d", &num);
  21. insert(i, j, i , j, num);
  22. }
  23. }
  24. while(q --)
  25. {
  26. int x1, y1, x2, y2, num;
  27. scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &num);
  28. insert(x1, y1, x2, y2, num);
  29. }
  30. for(int i = 1; i <= n; i ++)
  31. {
  32. for(int j = 1; j <= m; j ++)
  33. {
  34. s[i][j] = p[i][j] + s[i -1][j] + s[i][j - 1] - s[i - 1][j - 1];
  35. printf("%d ", s[i][j]);
  36. }
  37. printf("\n");
  38. }
  39. return 0;}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/434048
推荐阅读
相关标签
  

闽ICP备14008679号