【CSP试题回顾】202104-2-邻域均值

CSP-202104-2-邻域均值

关键点:二维差分数组

详见:【CSP考点回顾】差分数组

解题思路

  1. 初始化矩阵和参数:首先,代码接收矩阵的大小(n x n),每个元素的亮度值(位于[0, L]区间),以及算法特定的其他参数(r 和 t)。
  2. 计算前缀和矩阵:使用前缀和技术创建一个新矩阵(prefixSum),用于快速计算任何子矩阵的元素总和。前缀和矩阵的每个元素代表从原始矩阵左上角到当前位置的元素总和。
  3. 遍历原始矩阵:对每个元素,计算它的"邻域"内的元素总和。邻域定义为以当前元素为中心,边长为(2r + 1)的方阵区域(或边界内的实际区域)。
  4. 计算邻域内元素的平均亮度:使用前缀和矩阵快速计算邻域内的元素总和,并除以邻域内的元素数量,得到平均亮度。
  5. 判断元素是否为"暗"元素:如果邻域内的平均亮度小于等于阈值t,则该元素被认为是"暗"的。

差分数组和时间复杂度优化:

  • 在未使用差分数组或前缀和技术时,直接计算每个元素的邻域内元素总和需要O(r^2)的时间(对于每个元素都要计算它邻域内的元素和,邻域大小约为 ( 2 r + 1 ) 2 (2r + 1)^2 (2r+1)2)。由于这需要对矩阵中的每个元素重复进行,总的时间复杂度将是 O ( n 2 r 2 ) O(n^2r^2) O(n2r2)

  • 使用差分数组或前缀和技术后,我们可以将任何子矩阵的元素总和的计算时间降低到 O ( 1 ) O(1) O(1)(只需四次数组查找和三次加减运算)。因此,总的时间复杂度降低为 O ( n 2 ) O(n^2) O(n2)(因为每个元素计算其邻域的总和变为常数时间)。这是通过提前计算所有可能子矩阵的元素和(即计算前缀和矩阵)实现的,从而在实际需要时可以立即获得任何特定邻域的总和。

完整代码

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

int n, L, r, t;

// 计算前缀和矩阵
void computePrefixSum(vector<vector<int>>& ps, const vector<vector<int>>& a) {
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            ps[i + 1][j + 1] = a[i][j] + ps[i + 1][j] + ps[i][j + 1] - ps[i][j];
        }
    }
}

// 计算(x1, y1)到(x2, y2)区域内的元素总和
int regionSum(const vector<vector<int>>& ps, int x1, int y1, int x2, int y2) {
    return ps[x2 + 1][y2 + 1] - ps[x2 + 1][y1] - ps[x1][y2 + 1] + ps[x1][y1];
}

int main() {
    cin >> n >> L >> r >> t;
    vector<vector<int>> matrixA(n, vector<int>(n));
    vector<vector<int>> prefixSum(n + 1, vector<int>(n + 1, 0));
    for (auto& it : matrixA) {
        for (auto& jt : it) {
            cin >> jt;
        }
    }

    computePrefixSum(prefixSum, matrixA);

    int darkNum = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            // 计算当前元素的邻域边界
            int xStart = max(0, i - r), yStart = max(0, j - r);
            int xEnd = min(n - 1, i + r), yEnd = min(n - 1, j + r);
            int area = (xEnd - xStart + 1) * (yEnd - yStart + 1);
            // 使用前缀和计算邻域内的元素总和
            int sum = regionSum(prefixSum, xStart, yStart, xEnd, yEnd);
            if ((double)sum / area <= t) {
                darkNum++;
            }
        }
    }

    cout << darkNum;
    return 0;
}

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Vue的体育汇App设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 核心技术的理论与分析 3 1.1 客户端技术 3 1.1.1 Vue.js框架 3 1.1.2 Vue.js路由管理 3 1.1.3 Vuex状态管理 3 1.1.4 MVVM开发模式 4 1.1.5 Vant组件库 5 1.2 服务端技术 5 1.2.1 Node.js 5 1.2.2 Egg.js框架 5 1.3 数据库技术 6 1.4 本章…

webUI自动化测试框架

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【LeetCode】升级打怪之路 Day 16:二叉树题型 —— 二叉树的构造

今日题目&#xff1a; 654. 最大二叉树105. 从前序与中序遍历序列构造二叉树106. 从中序与后序遍历序列构造二叉树889. 根据前序和后序遍历构造二叉树 目录 LC 654. 最大二叉树 【easy】 Problem&#xff1a;根据遍历序列来还原二叉树 【classic】 ⭐⭐⭐⭐⭐LC 105. 从前序与中…

数据库原理实验课(1)

目录 实验内容 安装头歌中的相关内容 具体过程 完结撒花~ 我也是第一次接触oracle的相关软件和操作&#xff0c;所以是一次傻瓜式教学记录 实验内容 安装头歌中的相关内容 具体过程 这是我在百度网盘中下载解压出来的oracle文件夹内的全部内容&#xff08;可能有因为安装完…

使用Portainer让测试环境搭建飞起来

Docker的用处不多加赘述&#xff0c;Docker目前有以下应用场景&#xff1a; 测试&#xff1a;Docker很适合用于测试发布&#xff0c;将 Docker 封装后可以直接提供给测试人员进行运行&#xff0c;不再需要测试人员与运维、开发进行配合&#xff0c;进行环境搭建与部署。 测试…

【技术】基于Github Pages搭建个人博客静态网页

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 文章目录 一、技术基础二、新建特殊仓库三、上传网页文件四、Github Pages设置 个人网页作为仅服务个人的网页&#xff0c;一…

Grafana变量默认全选

注&#xff1a;本文基于Grafana v9.2.8编写 1 问题 EKS集群里的node按照不同label被分为几类&#xff0c;我需要对这几类的node做一些统计。我希望当我使用lable选择时&#xff0c;node的值自动设置为该lable的所有node集合&#xff0c;而不需要再手动全选。 2 解决方案 变…

微信小程序(五十四)腾讯位置服务示范(2024/3/8更新)

教程如下&#xff1a; 上一篇 1.先在官网注册一下账号&#xff08;该绑定的都绑定一下&#xff09; 腾讯位置服务官网 2.进入控制台 3.创建应用 3. 额度分配 4.下载微信小程序SDK 微信小程序SDK下载渠道 5.解压将俩js文件放在项目合适的地方 6.加入安全域名or设置不验证合…

扩展CArray类,增加Contain函数

CArray不包含查找类的函数&#xff0c;使用不便。考虑扩展CArray类&#xff0c;增加Contain函数&#xff0c;通过回调函数暴露数组元素的比较方法&#xff0c;由外部定义。该方法相对重载数组元素的“”符号更加灵活&#xff0c;可以根据需要配置不同的回调函数进行比较 //类型…

AD20中关于“failed to add class member”的解决方法

目录 问题描述&#xff1a; 解决方法&#xff1a; 1.切换至PCB界面-选择工具栏的设计-类 2.把Component classes中的所有的类全部按照图中删除&#xff0c;保存 3.重新返回原理图界面转换PCB即可成功 问题描述&#xff1a; failed to add class member&#xff1a;未能添加…

解答关于:水牛社软件是做什么的?水牛社软件靠谱么?

很多对我们软件感兴趣但是没有入手的观望者都会有这样的疑问&#xff1a;水牛社软件具体是做什么的&#xff1f;水牛社软件靠谱么&#xff1f; 其实软件的简介已经讲的很清楚了&#xff0c;但是软件不是功能性软件&#xff0c;所以不能给大家免费试用&#xff0c;短期任务版块…

智能驾驶规划控制理论学习08-自动驾驶控制模块(轨迹跟踪)

目录 一、基于几何的轨迹跟踪方法 1、基本思想 2、纯追踪 3、Stanly Method 二、PID控制器 三、LQR&#xff08;Linear Quadratic Regulator&#xff09; 1、基本思想 2、LQR解法 3、案例学习 基于LQR的路径跟踪 基于LQR的速度跟踪 4、MPC&#xff08;Mode…

Python通过SFTP实现网络设备配置备份

一、背景 为了防止网络设备意外损坏&#xff0c;导致配置文件无法恢复&#xff0c;可以通过将网络设备的配置文件备份到本地电脑上。 一般情况下&#xff0c;设备支持通过FTP、TFTP、FTPS、SFTP和SCP备份配置文件。其中使用FTP和TFTP备份配置文件比较简单&#xff0c;但是存在…

JAVA虚拟机实战篇之内存调优[4](内存溢出问题案例)

文章目录 版权声明修复问题内存溢出问题分类 分页查询文章接口的内存溢出问题背景解决思路问题根源解决思路 Mybatis导致的内存溢出问题背景问题根源解决思路 导出大文件内存溢出问题背景问题根源解决思路 ThreadLocal占用大量内存问题背景问题根源解决思路 文章内容审核接口的…

尚硅谷JavaScript高级学习笔记

01 准备 JavaScript中函数是对象。我们后续描述构造函数的内存模型时&#xff0c;会将构造函数称为构造函数对象。 02 数据类型 typeof 运算符来查看值的类型&#xff0c;它返回的是类型的字符串值 会做数据转换 03 相关问题 04数据_变量_内存 05相关问题1 06相关问题2 …

办公电脑换成MacBookPro半年之后……

小白是从2008年开始接触电脑的&#xff0c;当时朋友给我注册的第一个QQ账号是2008年4月。 从此&#xff0c;小白一直认为电脑全部都是Windows系统。直到上大学那年&#xff0c;看到了外教老师的MacBookPro…… 折腾电脑的开始居然是起源于诺基亚手机&#xff0c;给半智能S40的…

Igraph入门指南 3

4、图转换到其他R数据结构 图是对实体关系的表达&#xff0c;在igraph中&#xff0c;图可以转换为三种数据结构。 4-1 图转邻接矩阵&#xff1a;as_adjacency_matrix | as_adj&#xff0c;结果是矩阵 邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵&#xff0c;但本函数使用…

老司机都懂的!【打赏】完美运营的最新视频打赏系统

完美运营的最新视频打赏系统优于市面上95%的打赏系统&#xff0c;与其他打赏系统相比&#xff0c;功能更加强大&#xff0c;完美运营且无bug。支付会调、短链接生成、代理后台、价格设置和试看功能等均没有问题。 以上为原简介&#xff0c;经测试验证。成功搭建并可以正常进入…

Linux学习之线程

目录 线程概念 1.什么是线程&#xff1f; 2.线程的优缺点 3.线程异常 4.线程用途 线程操作 1.如何给线程传参 2.线程终止 3.获取返回值 4.分离状态 5.退出线程 线程的用户级地址空间&#xff1a; 线程的局部存储 线程的同步与互斥 互斥量mutex 数据不一致的主要过…

Sora的核心技术预测

在ChatGPT火爆全网的一年后&#xff0c;OpenAI公司又一次大显身手&#xff1a;推出了全新的文生视频大模型Sora。直接输入文字提示词&#xff0c;即可直接生成长达60秒的视频。 “现实真的要不存在了。” 马斯克直接大呼&#xff1a;人类彻底完蛋了&#xff01; 马斯克为什么…