• 【模板】差分


    一维差分:

    描述

    给你一个长度为n的正数数组a_1,a_2,...a_na1​,a2​,...an​.

    接下来对这个数组进行m次操作,每个操作包含三个参数l,r,k,代表将数组中a_l,...a_ral​,...ar​部分都加上k。

    请输出操作后的数组。

    输入描述:

    第一行包含两个整数n和m。
    第二行包含n个整数表示a_1,...a_na1​,...an​
    接下来是m行,每行三个整数,分别代表每次操作的参数l,r,k.

    输出描述:

    输出1行,表示m次操作后的a_1,...a_na1​,...an​

    示例1

    输入:

    3 2
    1 2 3
    1 2 4
    3 3 -2

    复制输出:

    5 6 1
    1. #include<stdio.h>
    2. int a[100005];
    3. long long difference[100005];
    4. int main()
    5. {
    6. int n,m;
    7. scanf("%d%d",&n,&m);
    8. for(int i=1;i<=n;i++)
    9. {
    10. scanf("%d",&a[i]);
    11. }
    12. difference[1]=a[1];
    13. for(int i=2;i<=n;i++)
    14. {
    15. difference[i]=a[i]-a[i-1];
    16. }
    17. for(int i=1;i<=m;i++)
    18. {
    19. int l,r,k;
    20. scanf("%d%d%d",&l,&r,&k);
    21. difference[l]=difference[l]+k;
    22. difference[r+1]-=k;
    23. }
    24. printf("%lld",difference[1]);
    25. long long sum=difference[1];
    26. for(int i=2;i<=n;i++)
    27. {
    28. sum+=difference[i];
    29. printf(" %lld",sum);
    30. }
    31. return 0;
    32. }

    二维差分

    描述

    给你一个n行m列的矩阵,下标从1开始。
    接下来有q次操作,每次操作输入5个参数x1, y1, x2, y2, k
    表示把以(x1, y1)为左上角,(x2,y2)为右下角的子矩阵的每个元素都加上k,
    请输出操作后的矩阵。

    输入描述:

    第一行包含三个整数n,m,q.
    接下来n行,每行m个整数,代表矩阵的元素

    接下来q行,每行5个整数x1, y1, x2, y2, k,分别代表这次操作的参数

    输出描述:

    输出n行,每行m个数,每个数用空格分开,表示这个矩阵。

    示例1

    输入:

    2 3 4
    1 2 3
    4 5 6
    1 1 2 2 3
    1 2 2 3 -1
    1 1 1 3 4
    1 1 2 1 1

    复制输出:

    9 8 6
    8 7 5
    1. #include<stdio.h>
    2. long long a[1005][1005];//表示原矩阵是差分矩阵的前缀和
    3. long long difference[1005][1005];//表示前缀和的差分
    4. int main()
    5. {
    6. int n,m,q;
    7. scanf("%d%d%d",&n,&m,&q);
    8. for(int i=1;i<=n;i++)
    9. {
    10. for(int j=1;j<=m;j++)
    11. {
    12. scanf("%lld",&a[i][j]);
    13. difference[i][j]=a[i][j]-a[i][j-1]-a[i-1][j]+a[i-1][j-1];
    14. //有前缀和矩阵得到该矩阵的具体值
    15. }
    16. }
    17. for(int i=1;i<=q;i++)
    18. {
    19. int x1,y1,x2,y2,k;
    20. scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&k);
    21. //如果是difference(i,j)处加上K,也就是说从(i,j)位置到右下角所有的值都会加上k
    22. //因为要从(x1,y1)到(x2,y2)所以要减去(x1,y2+1)和(y2+1,x1),由于从(x2+1,y2+1)减掉了两个k所以要加上一个k
    23. difference[x1][y1]+=k;
    24. difference[x1][y2+1]-=k;
    25. difference[x2+1][y1]-=k;
    26. difference[x2+1][y2+1]+=k;
    27. }
    28. for(int i=1;i<=n;i++)
    29. {
    30. for(int j=1;j<=m;j++)
    31. {
    32. difference[i][j]+=difference[i-1][j]+difference[i][j-1]-difference[i-1][j-1];
    33. if(j==1)
    34. {
    35. printf("%lld",difference[i][j]);
    36. }
    37. else{
    38. printf(" %lld",difference[i][j]);
    39. }
    40. }
    41. printf("\n");
    42. }
    43. return 0;
    44. }

  • 相关阅读:
    【Oracle】数据库导入导出
    数据结构与算法 | 第一章:概论
    使用 Fluent Bit 实现云边统一可观测性
    python用pychart库,实现将经纬度信息在地图上显示
    牛客刷题——剑指offer(第6期)
    Simple-BEV: 多传感器BEV感知真正重要的是什么?(斯坦福大学最新)
    元宇宙电商-NFG系统,解决了数字藏品市场的哪些痛点?
    安卓逆向 - EdXposed LSPosed VirtualXposed
    使用OpenCV如何确定一个对象的方向
    docker容器编排原来这么丝滑~
  • 原文地址:https://blog.csdn.net/qq_42434171/article/details/126877783