【算法| 差分 No.1】AcWing 797. 差分 & AcWing 798. 差分矩阵

墨蓝 2024-04-27 06:57 136阅读 0赞

个人主页:兜里有颗棉花糖
欢迎 点赞? 收藏✨ 留言✉ 加关注?本文由 兜里有颗棉花糖 原创
收录于专栏【手撕算法系列专栏】
?本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
?希望我们一起努力、成长,共同进步。

目录

  • 一、AcWing 797. 差分
    • 解题代码
  • 二、AcWing 798. 差分矩阵
    • 解题代码

一、AcWing 797. 差分

原题链接:点击直接跳转到该题目

关键代码:

  • b[l] += c;
  • b[r + 1] -= c;

解题代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N = 1e5 + 10;
  7. int nums[N];
  8. int b[N];
  9. void insert(int l,int r,int c)
  10. {
  11. b[l] += c;
  12. b[r + 1] -= c;
  13. }
  14. int main()
  15. {
  16. int n,m;
  17. cin >> n >> m;
  18. for(int i = 1;i <= n;i++) cin >> nums[i];
  19. while(m--)
  20. {
  21. int l,r,c;
  22. cin >> l >> r >> c;
  23. insert(l,r,c);
  24. }
  25. for(int i = 2;i <= n;i++) b[i] = b[i] + b[i - 1];
  26. for(int i = 1;i <= n;i++) nums[i] = nums[i] + b[i];
  27. for(int i = 1;i <= n;i++) printf("%d ",nums[i]);
  28. return 0;
  29. }

二、AcWing 798. 差分矩阵

原题链接:点击直接跳转到该题目

在这里插入图片描述

代码关键:

  • b[x1][y1] += c;
  • b[x2 + 1][y1] -= c;
  • b[x1][y2 + 1] -= c;
  • b[x2 + 1][y2 + 1] += c;

解题代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N = 1010;
  7. int nums[N][N];
  8. int b[N][N];
  9. void insert(int x1,int y1,int x2,int y2,int c)
  10. {
  11. b[x1][y1] += c;
  12. b[x1][y2 + 1] -= c;
  13. b[x2 + 1][y1] -= c;
  14. b[x2 + 1][y2 + 1] += c;
  15. }
  16. int main()
  17. {
  18. int n,m,q;
  19. cin >> n >> m >> q;
  20. for(int i = 1;i <= n;i++)
  21. for(int j = 1;j <= m;j++)
  22. cin >> nums[i][j];
  23. while(q--)
  24. {
  25. int x1,y1,x2,y2,c;
  26. cin >> x1 >> y1 >> x2 >> y2 >> c;
  27. insert(x1,y1,x2,y2,c);
  28. }
  29. for(int i = 1;i <= n;i++)
  30. for(int j = 1;j <= m;j++)
  31. {
  32. b[i][j] = b[i - 1][j] + b[i][j - 1] + b[i][j] - b[i - 1][j - 1];
  33. nums[i][j] += b[i][j];
  34. }
  35. // 打印最终数组
  36. for(int i = 1;i <= n;i++)
  37. {
  38. for(int j = 1;j <= m;j++)
  39. {
  40. printf("%d ",nums[i][j]);
  41. }
  42. printf("\n");
  43. }
  44. return 0;
  45. }

发表评论

表情:
评论列表 (有 0 条评论,136人围观)

还没有评论,来说两句吧...

相关阅读

    相关 798. 矩阵

    输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和