码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 洛谷 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
  • 相关阅读:
    Centos7安装kvm,配置虚拟机网络
    线程间有哪些资源是不可以共享的?
    Codeforces Round #810 (Div. 2)D~A
    知乎万赞的:网络安全系统自学就业路线,建议收藏!
    观察者(observer)模式(二) —— 实现线程安全的监听器
    IntelliJ IDEA 2022.2 正式发布:已完全支持 Spring 6 和 Spring Boot 3
    2023年DevOps国际峰会暨BizDevOps企业峰会(DOIS北京站)-核心PPT资料下载
    Visual Studio 2022开发Arduino详述
    安卓的项目如何进行高效的提问
    【Flowable】FlowableUI使用以及在IDEA使用flowable插件(二)
  • 原文地址:https://blog.csdn.net/m0_52238102/article/details/124675343
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号