地毯(暴力+差分两种方法)

news/2024/7/7 22:54:53

题目描述

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

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

输入格式

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

接下来 m 行,每行两个坐标 (x_1,y_1) 和 (x_2,y_2),代表一块地毯,左上角是 (x_1,y_1),右下角是 (x_2,y_2)。

输出格式

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

第 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

提示

样例解释

覆盖第一个地毯后:

覆盖第一、二个地毯后:

覆盖所有地毯后:

数据范围

对于 20% 的数据,有 n<= 50,m<= 100。

对于 100% 的数据,有 n,m<= 1000。

第一种方法:暴力做法。这道题的数据范围很小,所以暴力也可以过所有样例。

代码比较简单就不多讲了。

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 100010;
int q[N][N]; // 定义一个二维数组来记录操作结果

int main()
{
    int n, m;
    cin >> n >> m; // 输入n和m,分别表示矩阵的大小和操作的次数
    
    // 进行m次操作
    for (int i = 0; i < m; i++)
    {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2; // 输入操作的左上角和右下角坐标
        
        // 针对操作的区域,进行累加操作
        for (int j = x1; j <= x2; j++)
        {
            for (int k = y1; k <= y2; k++)
            {
                q[j][k]++; // 将区域内的每个元素增加1
            }
        }
    }
    
    // 输出操作后的结果
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            cout << q[i][j] << " "; // 输出每个位置的操作结果
        }
        cout << endl;
    }
    
    return 0;
}

第二种方法:差分。

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1010;
int q[N][N]; // 定义一个二维数组来记录操作结果

int main()
{
    int n, m;
    cin >> n >> m; // 输入n和m,分别表示矩阵的大小和操作的次数
    
    // 进行m次操作
    for (int i = 0; i < m; i++)
    {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2; // 输入操作的左上角和右下角坐标
        
        // 更新操作
        for (int j = x1; j <= x2; j++)
        {
            q[j][y1]++;       // 在该列上加1
            q[j][y2 + 1]--;   // 在该列的下一行减1,用于区分操作的范围
        }
    }
    
    // 根据更新操作,计算每个位置的最终值
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            q[i][j] += q[i][j - 1]; // 当前位置的值等于前一列的值加上当前位置的值
            cout << q[i][j] << " "; // 输出每个位置的最终结果
        }
        cout << endl;
    }
    
    return 0;
}


http://lihuaxi.xjx100.cn/news/1447959.html

相关文章

像素相关知识

物理像素 指的是物理设备上真实的小方块个数&#xff0c;就是拿放大镜看屏幕时看到的像素点&#xff0c; 每个物理像素具体的大小是不固定的&#xff0c;不同设备不相同&#xff0c;由厂家设置 逻辑像素 指的就是我们css用到的px这个单位的像素 像素比&#xff08;DPR&…

运营商三要素 API:构建安全高效的身份验证系统

当今数字化的世界中&#xff0c;身份验证是各行各业中至关重要的一环。为了保护用户的隐私和数据安全&#xff0c;企业需要寻求一种既安全可靠又高效便捷的身份验证方式。运营商三要素 API 应运而生&#xff0c;为构建安全高效的身份验证系统提供了有力的解决方案。 运营商三要…

【skynet】skynet 下载编译

写在前面 skynet 是相当有水准的一个系统框架&#xff0c;但是目前多数资料都是默认读者有一定的经验&#xff0c;对于从零开始的小伙伴来说比较心累。所以看能不能自己做一个从零开始的笔记&#xff0c;不是帮助别人&#xff0c;主要还是帮助自己。 文章目录 写在前面准备工作…

SQL注入是什么?如何防范?

什么是SQL注入&#xff1f; SQL注入&#xff08;SQLi&#xff09;是一种注入攻击&#xff0c;可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询&#xff0c;使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施&#…

第4章 微服务框架主体搭建

mini商城第4章 微服务框架主体搭建 一、课题 框架搭建 二、回顾 1、整体业务功能分析 2、根据业务需求设计表结构及字段 三、目标 1、版本控制器的搭建使用 2、能独立自主的搭建微服务框架 3、学会考虑一些公共的工具组件 4、网关模块的应用 四、内容 第1章 版本控…

一个小时入门 EJB

前置知识 在开始学习Java EE的Enterprise JavaBeans (EJB)之前&#xff0c;以下是一些你可能需要提前了解的技术和概念&#xff1a; Java基础&#xff1a;熟悉Java的基础知识&#xff0c;包括面向对象的概念&#xff08;例如类、接口、继承和多态等&#xff09;、基本的数据结…

Lua脚本对比redis事务区别是什么

redis官方对于lua脚本的解释&#xff1a;Redis使用同一个Lua解释器来执行所有命令&#xff0c;同时&#xff0c;Redis保证以一种原子性的方式来执行脚本&#xff1a;当lua脚本在执行的时候&#xff0c;不会有其他脚本和命令同时执行&#xff0c;这种语义类似于 MULTI/EXEC。从别…

量子计算的突破:从理论到实践

章节一&#xff1a;引言 随着信息时代的到来&#xff0c;计算科学与技术也在不断迎来新的突破与革新。其中&#xff0c;量子计算作为一项引人瞩目的前沿技术&#xff0c;正逐渐从理论走向实践。量子计算以其在处理复杂问题上的巨大潜力&#xff0c;吸引着全球科学家和工程师的关…