zoukankan      html  css  js  c++  java
  • 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 个整数,表示所有操作进行完毕后的最终矩阵。

    数据范围

    1n,m10001≤n,m≤1000,
    1q1000001≤q≤100000,
    1x1x2n1≤x1≤x2≤n,
    1y1y2m1≤y1≤y2≤m,
    1000c1000−1000≤c≤1000,
    10001000−1000≤矩阵内元素的值≤1000

    输入样例:

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

    输出样例:

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

    有些步骤可以合并

    代码:
    import java.util.Scanner;
    
    public class Main {
            static final int max=1005;
            static int a[][]=new int[max][max];
            static int b[][]=new int[max][max];
            public static void insert(int x1,int y1,int x2,int y2,int c){
                  b[x1][y1]+=c;
                  b[x2+1][y1]-=c;
                  b[x1][y2+1]-=c;
                  b[x2+1][y2+1]+=c;
            }
           public static void main(String[] args) {
                   Scanner scan=new Scanner(System.in);
                   int n=scan.nextInt();
                   int m=scan.nextInt();
                   int t=scan.nextInt();
                   for(int i=1;i<=n;i++)
                       for(int j=1;j<=m;j++)
                           a[i][j]=scan.nextInt();
                   for(int i=1;i<=n;i++)
                       for(int j=1;j<=m;j++)
                           insert(i,j,i,j,a[i][j]);//差分数组初始化
                   while(t-->0){  //矩阵更新操作
                         int x1=scan.nextInt();
                         int y1=scan.nextInt();
                         int x2=scan.nextInt();
                         int y2=scan.nextInt();
                         int c=scan.nextInt();
                         insert(x1,y1,x2,y2,c);
                   }
                   for(int i=1;i<=n;i++)
                       for(int j=1;j<=m;j++)
                           b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];//求差分数组的前缀和
                   for(int i=1;i<=n;i++){  //输出
                       for(int j=1;j<=m;j++)
                           System.out.print(b[i][j]+" ");
                       System.out.println();
                   }
                       
        }
    }
  • 相关阅读:
    龙年新作:水印文字添加工具源码摘要
    C语言关键字 浪里白条:goto
    继续聊WPF——自定义命令
    CSS3新的鼠标样式介绍
    C语言深入理解 常量与变量
    XCode 4 不能运行的解决办法
    Runtime专题:详解IOS开发应用之并发Dispatch Queues
    C语言关键字 乱世枭雄:static与extern
    一步步带你做vue后台管理框架(一)——介绍框架
    怎么在谷歌浏览器中安装.crx扩展名的离线Chrome插件?
  • 原文地址:https://www.cnblogs.com/qdu-lkc/p/12202668.html
Copyright © 2011-2022 走看看