• 差分(前缀和的逆运算)


    797. 差分

    输入一个长度为 n

    的整数序列。

    接下来输入 m

    个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c

    请你输出进行完所有操作后的序列。

    输入格式

    第一行包含两个整数 n

    和 m

    第二行包含 n

    个整数,表示整数序列。

    接下来 m

    行,每行包含三个整数 l,r,c

    ,表示一个操作。

    输出格式

    共一行,包含 n

    个整数,表示最终序列。

    数据范围

    1≤n,m≤100000

    ,
    1≤l≤r≤n,
    −1000≤c≤1000,
    −1000≤整数序列中元素的值≤1000

    输入样例:

    1. 6 3
    2. 1 2 2 1 2 1
    3. 1 3 1
    4. 3 5 1
    5. 1 6 1

    输出样例:

    3 4 5 3 4 2
    

     

    数组a是原数组,d是差分数组,所谓差分数组就是a是d的前缀和,即差分与
     * 前缀和互为逆运算;由数组a构造出数组d;
     * 在原数组的一段区间内所有元素都增加一个数,则可以在差分数组中进行,
     * 最后再用差分数组进行计算原数组最后的结果;
     * 这样每改变一段区间内的元素的值,可用O(1)的时间完成;
     * 假设在[l,r]区间内增加val值,那么怎么操作:可以想一下,a是d的前缀和,
     * d[l]增加一个val,会导致a[l]及其后面的所有元素的值都增加了val,所以
     * 需要在d[r+1]减去一个val,避免a[r]后面的元素也加上val;
     *
     * 最开始的时候,可以看成数组a的所有元素都是0,所有d的所有元素也是0;
     * 后面输入一个a[i],就对数组d进行操作;

    1. /**
    2. * 数组a是原数组,d是差分数组,所谓差分数组就是a是d的前缀和,即差分与
    3. * 前缀和互为逆运算;由数组a构造出数组d;
    4. * 在原数组的一段区间内所有元素都增加一个数,则可以在差分数组中进行,
    5. * 最后再用差分数组进行计算原数组最后的结果;
    6. * 这样每改变一段区间内的元素的值,可用O(1)的时间完成;
    7. * 假设在[l,r]区间内增加val值,那么怎么操作:可以想一下,a是d的前缀和,
    8. * d[l]增加一个val,会导致a[l]及其后面的所有元素的值都增加了val,所以
    9. * 需要在d[r+1]减去一个val,避免a[r]后面的元素也加上val;
    10. *
    11. * 最开始的时候,可以看成数组a的所有元素都是0,所有d的所有元素也是0;
    12. * 后面输入一个a[i],就对数组d进行操作;
    13. */
    14. #include
    15. using namespace std;
    16. const int N = 1e5+10;
    17. int a[N],d[N]={0};
    18. void Insert(int l,int r,int val)
    19. {
    20. d[l]+=val;
    21. d[r+1]-=val;
    22. }
    23. int main()
    24. {
    25. int n,m;
    26. scanf("%d%d",&n,&m);
    27. for(int i=1;i<=n;++i)
    28. scanf("%d",&a[i]);
    29. for(int i=1;i<=n;++i)
    30. Insert(i,i,a[i]);
    31. while(m--)
    32. {
    33. int l,r,val;
    34. scanf("%d%d%d",&l,&r,&val);
    35. Insert(l,r,val);
    36. }
    37. for(int i=1;i<=n;++i)
    38. {
    39. a[i]=a[i-1]+d[i];
    40. printf("%d ",a[i]);
    41. }
    42. return 0;
    43. }

    798. 差分矩阵

    输入一个 n

    行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1) 和 (x2,y2)

    表示一个子矩阵的左上角坐标和右下角坐标。

    每个操作都要将选中的子矩阵中的每个元素的值加上 c

    请你将进行完所有操作后的矩阵输出。

    输入格式

    第一行包含整数 n,m,q

    接下来 n

    行,每行包含 m

    个整数,表示整数矩阵。

    接下来 q

    行,每行包含 5 个整数 x1,y1,x2,y2,c

    ,表示一个操作。

    输出格式

    共 n

    行,每行 m

    个整数,表示所有操作进行完毕后的最终矩阵。

    数据范围

    1≤n,m≤1000

    ,
    1≤q≤100000,
    1≤x1≤x2≤n,
    1≤y1≤y2≤m,
    −1000≤c≤1000,
    −1000≤矩阵内元素的值≤1000

    输入样例:

    1. 3 4 3
    2. 1 2 2 1
    3. 3 2 2 1
    4. 1 1 1 1
    5. 1 1 2 2 1
    6. 1 3 2 3 2
    7. 3 1 3 4 1

    输出样例:

    1. 2 3 4 1
    2. 4 3 4 1
    3. 2 2 2 2

      * 数组a是原数组,d是差分数组,所谓差分数组就是a是d的前缀和,即差分与前缀和
        互为逆运算;由数组a构造出数组d;
     * 子矩阵是一样的操作,画一个正方格子出来,模拟一下就明白了

    1. /**
    2. * 数组a是原数组,d是差分数组,所谓差分数组就是a是d的前缀和,即差分与前缀和
    3. 互为逆运算;由数组a构造出数组d;
    4. * 子矩阵是一样的操作,画一个正方格子出来,模拟一下就明白了
    5. */
    6. #include
    7. using namespace std;
    8. const int N = 1010;
    9. int a[N][N],d[N][N]={0};
    10. void Insert(int x1,int y1,int x2,int y2,int val)
    11. {
    12. d[x1][y1]+=val;
    13. d[x1][y2+1]-=val;
    14. d[x2+1][y1]-=val;
    15. d[x2+1][y2+1]+=val;
    16. }
    17. int main()
    18. {
    19. int n,m,q;
    20. scanf("%d%d%d",&n,&m,&q);
    21. for(int i=1;i<=n;++i)
    22. for(int j=1;j<=m;++j)
    23. scanf("%d",&a[i][j]);
    24. for(int i=1;i<=n;++i)
    25. for(int j=1;j<=m;++j)
    26. Insert(i,j,i,j,a[i][j]);
    27. while(q--)
    28. {
    29. int x1,y1,x2,y2,val;
    30. scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&val);
    31. Insert(x1,y1,x2,y2,val);
    32. }
    33. for(int i=1;i<=n;++i)
    34. for(int j=1;j<=m;++j)
    35. a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+d[i][j];
    36. for(int i=1;i<=n;++i)
    37. {
    38. for(int j=1;j<=m;++j)
    39. printf("%d ",a[i][j]);
    40. puts(""); //输出一个空行
    41. }
    42. return 0;
    43. }

  • 相关阅读:
    数据结构与算法之时间复杂度和空间复杂度(C语言版)
    16结构型模式-组合模式
    Bash语法中的字符串拼接与比较
    IDEA2023.2.1取消空包隐藏,切换包结构(Compact Middle Packages)
    Small RTOS51 学习笔记(1)使用 RTOS 的好处
    重温C语言10---预处理与宏定义
    计算机视觉-图像的傅里叶变换
    python requests爬取税务总局税案通报、税务新闻和政策解读
    .Net Web API 005 Controller上传小文件
    RestTemplat
  • 原文地址:https://blog.csdn.net/qq_51825761/article/details/126127367