P3397 地毯 Python题解

news2024/11/6 3:02:06

地毯

题目描述

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

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

输入格式

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

接下来 m m m 行,每行两个坐标 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2),代表一块地毯,左上角是 ( x 1 , y 1 ) (x_1,y_1) (x1,y1),右下角是 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)

输出格式

输出 n n n 行,每行 n n n 个正整数。

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

样例 #1

样例输入 #1

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

样例输出 #1

0 1 1 1 0
0 1 1 0 0
0 1 2 1 1
0 0 1 1 1
0 0 1 1 1

提示

样例解释

覆盖第一个地毯后:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

覆盖第一、二个地毯后:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
0 0 0 1 1 1 2 2 2 1 1 1 1 1 1
0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 1 1 1 1 1 1 1 1 1

覆盖所有地毯后:

0 0 0 1 1 1 1 1 1 1 1 1 0 0 0
0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
0 0 0 1 1 1 2 2 2 1 1 1 1 1 1
0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 1 1 1 1 1 1 1 1 1

数据范围

对于 20 % 20\% 20% 的数据,有 n ≤ 50 n\le 50 n50 m ≤ 100 m\le 100 m100

对于 100 % 100\% 100% 的数据,有 n , m ≤ 1000 n,m\le 1000 n,m1000

题解

做这道题之前我还不是很懂差分的,于是去搜了下差分,我从【C++算法基础】#9前缀和与差分 | 轻松学算法 | 图解ACM竞赛算法
学习了差分和前缀和的关系,以及差分的一些简单的应用。
经过学习之后得出这题的解题思路。如果嫌看视频有点慢,只想学习一下差分是什么,也可以只看我的文章,希望有帮助。

首先是差分的应用场景:
差分是用于求数组部分区间(有区间重叠)变化后的数组的。
什么意思呢?就是比如说对数组的 [ 1 , 3 ] 、 [ 2 , 6 ] [1,3]、[2,6] [1,3][2,6]两个区间分别进行 + 2 、 − 4 +2、-4 +24的操作,这两个区间有重叠部分,如果是正常的方法就是有k个区间修改,枚举k次,每次枚举修改一次。时间复杂度为 O ( n k ) O(nk) O(nk)

而差分呢可以把这k次枚举直接消掉,我们只需要枚举1次,就可以完成对区间的修改!
差分维护一个差分数组 d i f f [ n ] diff[n] diff[n],这个数组里面记录着数组的变化,
首先 d i f f [ i ] = a [ i ] − a [ i − 1 ] diff[i] = a[i] - a[i-1] diff[i]=a[i]a[i1]

例如:
我们想要让区间 [ 2 , 3 ] [2,3] [2,3]的数 + 2 +2 +2
那么令 d i f f [ 2 ] = 2 , d i f f [ 4 ] = − 2 diff[2] = 2, diff[4] = -2 diff[2]=2,diff[4]=2,为什么这么操作?
因为 d i f f [ i ] = a [ i ] − a [ i − 1 ] diff[i] = a[i] - a[i-1] diff[i]=a[i]a[i1]
所以 a [ i ] = a [ i − 1 ] + d i f f [ i ] a[i] = a[i-1] + diff[i] a[i]=a[i1]+diff[i]
我们可以看到,当我们
d i f f [ 2 ] = 2 diff[2] =2 diff[2]=2后,
a [ 2 ] = a [ 1 ] + d i f f [ 2 ] a[2] = a[1] + diff[2] a[2]=a[1]+diff[2] a [ 2 ] a[2] a[2]比原来的 a [ 2 ] a[2] a[2] 2 2 2
a [ 3 ] = a [ 2 ] + d i f f [ 3 ] a[3] = a[2] + diff[3] a[3]=a[2]+diff[3],因为 a [ 2 ] a[2] a[2]已经比原来的多 2 2 2了,所以此时新的 a [ 3 ] a[3] a[3]就比旧的也多 2 2 2

以此类推,当我们修改 d i f f [ 2 ] = 2 diff[2]=2 diff[2]=2后,后续所有 a [ i > = 2 ] a[i >=2] a[i>=2]都比原先的多 2 2 2

可是我们只想修改区间 [ 2 , 3 ] [2,3] [2,3],那么我们需要让后续的 a [ i > 3 ] a[i>3] a[i>3]抵消掉多出来的 2 2 2

方法也很简单,就是把 d i f f [ 4 ] diff[4] diff[4]修改成 − 2 -2 2即可。

看完差分的思想后,这题就没什么特别大的难度了,我们只需要把每行的差分数组求出来,然后边还原新的数组就可以得到每个格子覆盖的地毯数量

N, M = map(int, input().strip().split())
diff = [[0 for _ in range(N+1)] for _ in range(N)]
coordinates = [list(map(int, input().strip().split())) for _ in range(M)]
for i in coordinates:
    for k in range(i[0], i[2]+1):
        diff[k-1][i[1]-1] += 1
        diff[k-1][i[3]] -= 1
matrix = [[0 for _ in range(N)] for _ in range(N)]
for i in range(N):
    for j in range(N):
        matrix[i][j] = matrix[i][j-1] + diff[i][j]
print("\n".join([" ".join(list(map(str, mi))) for mi in matrix]))

在这里插入图片描述

这题显然还可以优化,等我什么时候变聪明了再回来优化吧。优化思路就是列也差分,那样维护 d i f f [ n ] diff[n] diff[n]只需要 O ( m ) O(m) O(m)时间复杂度,而我的代码维护 d i f f [ n ] diff[n] diff[n]需要 O ( m n ) O(mn) O(mn)时间复杂度。
具体怎么维护后续又怎么还原我还没搞懂,这个大佬们轻喷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在矩池云使用 Llama-3.2-11B-Vision 详细指南

Llama 3.2-Vision是Meta开发的一系列多模态大型语言模型(LLMs),包含11B和90B两种规模的预训练和指令调整模型。 这些模型专门优化用于视觉识别、图像推理、字幕生成和回答有关图像的一般问题。Llama 3.2-Vision模型在常见行业基准测试中的表…

docker下载mysql时出现Unable to pull mysql:latest (HTTP code 500) server error 问题

报错 Unable to pull mysql:latest (HTTP code 500) server error - Get “https://registry-1.docker.io/v2/”: EOF 解决方法 将VPN开到Global模式 解决啦

C# 解决Excel边框样式无法复制问题及实现格式刷功能

目录 问题现象 范例运行环境 解决方案 剪贴板加特殊粘贴 自定义样式 直接赋值 完美方案 小结 问题现象 在运行数据表数据导出到 EXCEL 数据输出时遇到了一个问题&#xff0c;开发者设计了单行细线下边框的输出模板&#xff0c;如下图设计&#xff1a; 其中 <%syst…

机器学习篇-day02-KNN算法实现鸢尾花模型和手写数字识别模型

一. KNN简介 KNN思想 K-近邻算法&#xff08;K Nearest Neighbor&#xff0c;简称KNN&#xff09;。比如&#xff1a;根据你的“邻居”来推断出你的类别 KNN算法思想&#xff1a;如果一个样本在特征空间中的k 个最相似的样本中的大多数属于某一个类别&#xff0c;则该样本也属…

sentinelhub3.7相比3.4的版本主要变化

sentinelhub3.7相比3.4的版本&#xff0c;主要变化包括: 1. 增加对sentinel 基线04.00数据产品的支持&#xff1b; 2. 将aws数据下载模块独立出来 3.4版本 3.7版本 3. 原来的DataSource改为DataCollection 3.7版本不再支持DataSource 3.4版本中的DataSource 3.7版本使用Data…

鸿蒙NEXT入门到实战(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

音频信号处理学习

来源B站&#xff0c;但是代码微改&#xff0c;更好理解。 B站网址&#xff1a;https://www.bilibili.com/video/BV1vT411m7yc/?spm_id_from333.788&vd_sourcec105ef445d9ba79ff025b5ba5869ce2b import mathimport librosa import numpy as np import matplotlib.pyplot a…

【floor报错注入】

一、sql语句基础 floor 向下取整 count 取数据的数量 group by 分组查询 Rand 随机数 limit 二、floor报错注入 主键重复报错 我们先了解group by产生的虚拟表的原理&#xff0c;了解到虚拟表的主键是不可以重复的 我们再可以通过Rand(0)函数规定固定种子后乘2&…

Jmeter常用函数、逻辑控制器

目录 一、Jmeter常用函数 counter函数 machineName函数 machineIP函数 Random函数 RandomString函数 RandomDate函数 time函数 二、逻辑控制器 IF控制器 循环控制器 foreach控制器 仅一次控制器 事务控制器 聚合报告 随机控制器 随机顺序控制器 一、Jmeter常用…

Webpack 打包后文件过大,如何优化?

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介Webpack 打包后文件过大&#xff0c;如何优化&#xff1f;1. 代码分割&#xff08;Code Splitting&#xff09;1.1 概念1.2 Webpack 的 SplitChunksPlugin示例配置&#xff1a; 1.3 按需加载&#xff08;Lazy Loading&#xff09;示…

位运算(1)_常见位运算总结

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 位运算(1)_常见位运算总结 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 基…

综合练习 学习案例

//验证码 前四位是字母 最后一位是数字 public class test1 {public static void main(String[] args){char [] charsnew char[52];for (int i 0; i <chars.length ; i) {if(i<25){chars[i](char)(i97);}else{chars[i](char)(i65-26);}}Random rnew Random();String cod…

虚商目前有哪些业务痛点?

虚拟运营商当前面临的业务痛点主要集中在市场竞争、运营成本、技术依赖、用户体验及政策监管等方面。 一、市场竞争激烈 1、竞争者数量增加: 随着市场准入门槛的降低&#xff0c;越来越多的企业进入虚拟运营商市场导致市场竟争日益激烈。为了争夺市场份额&#xff0c;企业不得不…

高校体育场小程序|高校体育场管理系统系统|体育场管理系统小程序设计与实现(源码+数据库+文档)

高校体育场管理系统小程序 目录 体育场管理系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道…

量化必备!股票常用数据批量下载、定时更新,代码打包好了!

上一节课我详细演示了从tushare获取股票列表和基本信息并且配置定时更新任务的详细流程&#xff0c;旨在教会想要学习通过Python获取股票数据并且定期更新的朋友。 不过有很多朋友完全没有Python基础&#xff0c;如果一开始把大量时间花费在搞数据上&#xff0c;本末倒置不说&…

学MybatisPlus

1.设置MySql的数据库 spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mp?useUnicodetrue&characterEncodingUTF-8&autoReconnecttrue&serverTimezoneAsia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: MySQL123 logging:l…

GIT安装及集成到IDEA中操作步骤

最近深感GIT使用技能太差&#xff0c;我只会些皮毛&#xff0c;还是得看官网&#xff0c;总结一下常用的操作方法吧。 GIT环境配置到IDEA中安装 一、GIt的基本的安装 这个不在这里赘述了&#xff0c;自己装一个git吧 二、给IDEA指定本地GIT的安装路径 1、下图这个是我本地的…

计算机毕业设计hadoop+spark+hive视频推荐系统 视频情感分析可视化 视频爬虫 视频爬虫 知识图谱 大数据毕设

《HadoopSparkHive视频推荐系统》开题报告 一、引言 随着互联网技术的飞速发展&#xff0c;视频内容呈现出爆炸式增长&#xff0c;用户面临着从海量视频资源中快速找到感兴趣内容的挑战。传统的视频推荐系统已难以满足大规模数据处理的需求&#xff0c;因此&#xff0c;基于H…

迁移学习案例-python代码

大白话 迁移学习就是用不太相同但又有一些联系的A和B数据&#xff0c;训练同一个网络。比如&#xff0c;先用A数据训练一下网络&#xff0c;然后再用B数据训练一下网络&#xff0c;那么就说最后的模型是从A迁移到B的。 迁移学习的具体形式是多种多样的&#xff0c;比如先用A训练…

仿真设计|基于51单片机的智能防火GSM上报仿真

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 &#xff08;1&#xff09;LCD1602显示实时温度&#xff08;DS18B20&#xff09;值和烟雾&#x…