• 洛谷 P3397 地毯 Java实现 二维差分


    题目描述

    在 n×n 的格子上有 m 个地毯。

    给出这些地毯的信息,问每个点被多少个地毯覆盖。

    输入格式
    第一行,两个正整数 n,m。意义如题所述。

    接下来 mm 行,每行两个坐标 (x1,y1)和 (x2,y2),代表一块地毯,左上角是 (x1,y1),右下角是 (x2,y2)。

    输出格式
    输出 nn 行,每行 nn 个正整数。

    第 i 行第 j 列的正整数表示 (i,j) 这个格子被多少个地毯覆盖。

    思路:二维差分+二维前缀和(矩阵前缀和)

    首先我们需要维护一个二维差分数组,这个二维差分数组会用到二维前缀和的知识,但是我更喜欢叫他矩阵前缀和。如果你想了解二维前缀和可以看我的另一篇文章:洛谷 P1719 最大加权矩形 Java实现 二维前缀和
    一维差分大家应该都很熟悉,就是cf[i]=a[i]-a[i-1];i等于1时,cf[i]=a[i]。
    在这里插入图片描述
    当在2-5区间内的元素都加上5,cf数组只需要改成:
    cf[2]+=5;cf[5+1]-=5;只需要修改两端点的差分值,这便是差分数组的优势。
    在这里插入图片描述
    二维差分数组则是cf[i][j]是以

    AC代码:

    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.io.StreamTokenizer;
    public class Main {
    	public static void main(String[] args) throws IOException{
    		StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    		PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    		in.nextToken();int N=(int)in.nval;
    		in.nextToken();int M=(int)in.nval;
    		int x1,x2,y1,y2;
    		int[][] a=new int[N+1][N+1];     //这个题初始全是0,真这个原数组a可以不用
    		int[][] qz=new int[N+2][N+2];   //qz是二维差分数组,加2是防止下标溢出
    		for(int oo=0;oo<M;oo++)
    		{
    			in.nextToken();x1=(int)in.nval;
    			in.nextToken();y1=(int)in.nval;
    			in.nextToken();x2=(int)in.nval;
    			in.nextToken();y2=(int)in.nval;
    			qz[x1][y1]++;
    			qz[x2+1][y1]--;
    			qz[x1][y2+1]--;
    			qz[x2+1][y2+1]++;
    		}
    		for(int i=1;i<=N;i++)
    			for(int j=1;j<=N;j++)    //下面用到容斥原理,求二维矩阵前缀和
    				qz[i][j]=qz[i][j]+qz[i][j-1]+qz[i-1][j]-qz[i-1][j-1];
    		for(int i=1;i<=N;i++)
    		{
    			for(int j=1;j<=N;j++)
    				pw.print(qz[i][j]+" ");
    			pw.println();
    		}
    		
    		pw.flush();
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    python学习笔记——初识列表
    Unity Xlua热更新框架(九):网络部分
    Mysql5.7开启SSL认证且支持Springboot客户端验证
    不念过往,不畏将来:2022年6月我辞职了...
    Linux内核设计与实现(四)| 中断 & 中断处理(上半部与下半部)
    VisualSVN 是 Visual Studio 的专业级 Subversion 集成插件
    jvisualvm的使用
    《Effective Java》知识点(11)--序列化
    硬件调试流程(工作总结)
    AI Earth ——开发者模式案例3:典型植被指数计算及区域统计
  • 原文地址:https://blog.csdn.net/m0_52238102/article/details/124675343