[算法题]【模板】前缀和/【模板】二维前缀和

news2024/9/21 16:19:52

题目链接: 【模板】前缀和 / 【模板】二维前缀和

两道前缀和模板题.

【模板】前缀和:

定义一维前缀和数组:

presum[i]: 表示 1 - i 位置的和

状态转移方程: presum[i] = presum[i - 1] + arr[i - 1]

定义数组时多开一个位置, 下标位置从 1 开始计算, 不从 0 开始是为了避免越界的情况, 从 0 开始在状态转移时会遇到下标为 -1 的问题.

如果要计算的区间和为 (3, 6), 那么公式为: presum[6] - presum[2], 所以通项公式为:

presum[end] - presum[begin - 1] 区间: [begin, end]

题解代码:

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

int main() 
{
    int n, q;
    cin >> n >> q;
    vector<long> arr(n);
    vector<long> presum(n + 1); //前缀和数组
    //输入并填充前缀和数组
    for(int i = 1; i <= n; ++i)
    {
        cin >> arr[i - 1];
        presum[i] = presum[i - 1] + arr[i - 1];
    }
    long begin, end;
    for(int i = 0; i < q; ++i)
    {
        cin >> begin >> end;
        cout << presum[end] - presum[begin - 1] << endl;
    }
    return 0;
}

【模板】二维前缀和

同样是要先预处理前缀和数组, 只不过是二维的, 要多开一行和一列, 避免下标为 -1 的情况.

定义状态:

presum[i][j]: 表示坐标 (1, 1) 到 (i, j) 的和, 如下图:

多开一行和一列默认初始化全为 0 即可.

首先是填前缀和数组的状态转移方程, 如图:

在填写 (i, j) 位置时, 可以划分成如图的矩形, 容易看出 (i, j) 位置的前缀和就等于紫色矩形 + 绿色矩形 + (i, j) 位置本身的值, 但是因为紫色矩形和绿色矩形有重叠的部分, 所以减去一个重合区域 presum[i - 1][j - 1], 那么状态转移方程为:

presum[i][j] = presum[i - 1][j] + presum[i][j - 1] - presum[i - 1][j - 1] + nums[i][j]

接下来是如何根据题目给定的坐标获取指定区域的前缀和, 如图:

假设要求的矩阵区域为 (x1, y1) - (x2, y2), 那么只需要先用 presum[x2][y2] 的前缀和减去绿色矩形 + 紫色矩形的前缀和, 但是因为紫色矩形和绿色矩形有重叠的部分, 所以重叠部分被减了两次, 多减了一次, 加回来 presum[x1 - 1][y1 - 1] 即为所求区域的值, 那么为:

presum[x2][y2] - presum[x1 - 1][y2] - presum[x2][y1 - 1] + presum[x1 - 1][y1 - 1]

题解代码:

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

int main() 
{
    int n, m, q;
    cin >> n >> m >> q;
    vector<vector<int>> nums(n + 1, vector<int>(m + 1));
    vector<vector<long>> presum(n + 1, vector<long>(m + 1)); //前缀和数组
    //填表
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= m; ++j)
        {
            cin >> nums[i][j];
            presum[i][j] = presum[i - 1][j] + presum[i][j - 1] - presum[i - 1][j - 1] + nums[i][j];
        }
    }
    int x1, y1, x2, y2;
    for(int i = 0; i < q; ++i)
    {
        cin >> x1 >> y1 >> x2 >> y2;
        cout << presum[x2][y2] - presum[x1 - 1][y2] - presum[x2][y1 - 1] + presum[x1 - 1][y1 - 1] << endl;
    }
    return 0;
}

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

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

相关文章

我眼中的胶水工作:挑战与机遇并存

我眼中的胶水工作&#xff1a;挑战与机遇并存 胶水工作&#xff0c;看似不起眼&#xff0c;却如同团队运作的隐形脉络&#xff0c;起着至关重要的连接作用。它涵盖了各种各样的任务&#xff0c;从注意到团队成员的阻碍并伸出援手&#xff0c;到审查设计文档&#xff0c;再到新…

实现微信的订阅消息或模板消息API来实现实时通知(服务通知)

实现微信的订阅消息或模板消息API以实现实时通知&#xff0c;需要经过几个关键步骤&#xff0c;包括用户订阅、消息发送和接收消息事件。以下是具体实现流程&#xff1a; 1. 用户订阅消息 首先&#xff0c;需要让用户订阅消息。这通常通过前端代码触发一个授权请求来完成&am…

C:每日一题:字符串左旋

题目&#xff1a;实现一个函数&#xff0c;可以实现字符串的左旋 例如&#xff1a;ABCD左旋一个字符就是BCDA&#xff1b;ABCD左旋两个字符就是CDAB&#xff1b; 1、解题思路&#xff1a; 1.确定目标旋转k个字符&#xff0c;我们要获取字符串的长度 len&#xff0c;目的是根…

8.14 day bug

bug1 好家伙&#xff0c;折腾一个小时没通过&#xff0c;原来是代码写多了 // 定义初始状态 const defaultState {login: false };// 定义 reducer const reducer (state defaultState, action) > {if (action.typeLOGIN) {// 当接收到 LOGIN action 时&#xff0c;更新…

备战秋招60天算法挑战,Day20

题目链接&#xff1a; https://leetcode.cn/problems/reverse-bits/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1W2421Z7bi/ LeetCode 190.颠倒二进制位 题目描述 颠倒给定的 32 位无符号整数的二进制位。 举个例子&#xff1a; 输入&#xff1a;n 00000010…

Nginx--简介、安装、常用命令和配置文件

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Nginx简介 1、nginx介绍 Nginx (engine x) 是一个高性能的 HTTP 和 反向代理 服务&#xff0c;也是一个IMAP/POP3/SMTP服务。因它的稳定性、丰…

分布式锁实现方案--redis、zookeeper、mysql

分布式锁的几种实现方式 悲观锁和乐观锁分布式锁的实现要求 -- 互斥性、避免死锁、可重入性、高可用行、性能互斥-只能有一个客户端持有锁 -- redis setnx避免死锁引入过期时间 -- redis ttl锁过期问题 -- 自动续期 -- redis释放别人锁问题 -- 锁附加唯一性 -- 给每个客户端设置…

【嵌入式linux开发】智能家居入门6:最新ONENET,物联网开放平台(QT、微信小程序、MQTT协议、ONENET云平台、旭日x3派)

智能家居入门6&#xff1a;最新ONENET物联网开放平台 前言最终现象一、ONENET云平台创建产品与设备二、使用MQTT客户端软件测试2.1 测试前的准备2.2 测试 三、LInux QT代码四、onenet 云端API介绍及微信小程序代码4.1 onenet API介绍4.2 微信小程序代码 五、板端运行 前言 ONE…

LeetCode 热题100-24

回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff…

四层负载企业实战

通过四层负载LVSkeepalived将请求转发到nginx代理服务器。通过代理服务器访问后端真实应用服务。 拓补图&#xff1a; 准备环境6台机器&#xff1b; lvskeepalived---两台 nginx代理 ---两台 tomcat----一台 php ----一台 所有机器关闭防火墙和selinux 所有机器解析如下…

APP安全检测报告内容详解

一、APP安全检测的必要性 APP安全检测是确保移动应用安全的重要一环。在开发过程中&#xff0c;由于技术、人员和管理等方面的原因&#xff0c;APP可能存在各种安全漏洞和风险。这些漏洞一旦被黑客利用&#xff0c;可能导致用户数据泄露、恶意代码注入、应用被篡改等严重后果。…

Windows下使用QT5.14.2编译MySQL8.0对应的最新64位驱动程序步骤

不得不说mysql更新的速度是真的快&#xff0c;最近一两年都更新了好几个的小版本了。如果安装了高版本的 mysql软件&#xff0c;低版本的驱动就不支持了&#xff0c;因此需要重新使用QT来编译对应的mysql驱动。具体办法如下&#xff1a; 1、官网下载最新的mysql8.0安装包。下载…

day04--js的综合案例

1.1 商品全选 需求&#xff1a;商品全选 1. 全选 &#xff1a;点击全选按钮,所有复选框都被选中 2. 全不选 &#xff1a;点击全不选按钮,所有复选框都被取消选中 3. 反选 &#xff1a; 点击反选按钮,所有复选框状态取反 <!DOCTYPE html> <html lang"en">…

智慧校园云平台电子班牌系统源码,智慧教育一体化云解决方案

智慧校园云平台电子班牌系统&#xff0c;利用先进的云计算技术&#xff0c;将教育信息化资源和教学管理系统进行有效整合&#xff0c;实现生态基础数据共享、应用生态统一管理&#xff0c;为智慧教育建设的统一性&#xff0c;稳定性&#xff0c;可扩展性&#xff0c;互通性提供…

利用PDAL库实现Las文件向PLY文件的转换

1、官网的下载链接 PDAL&#xff08;Point Data Abstraction Library&#xff09;是一个开源的C库&#xff0c;专门用于处理三维点云数据。它提供了数据读取、转换、过滤、统计分析等多种功能&#xff0c;支持多种数据格式&#xff0c;如LAS、LiDAR、ASCII等。在IT行业中&…

Java常用集合(List、Map)类型相关问题整理

一、背景 针对Java基础集合的部分&#xff0c;对一些常见的问题进行整理&#xff0c;方便后续能够随时复习 二、问题与回答 &#xff08;1&#xff09;Java集合类ArrayList初始化时数组的默认长度是多少&#xff1f; 答&#xff1a;在new ArrayList() 这段代码执行完后&a…

类Unix环境在Windows上的演进史

自从以Unix为基础的操作系统被发明以来&#xff0c;尝试在Windows环境中模仿Unix操作的工具就一直存在。这种需求源于许多原因&#xff0c;包括Unix对脚本和命令行工具的强大支持&#xff0c;以及Unix和Linux系统在科学、工程和其他技术领域的广泛使用。下面就让我们一起探讨下…

input[type=checkbox]勾选框自定义样式

效果图&#xff1a; <template> <input class"rule-checkbox" type"checkbox" checked v-model"isChecked" /> </template><script setup lang"ts"> import { ref } from vue; const isChecked ref(); </…

应急响应-DDOS-技术指南

初步预判 通常&#xff0c;可从以下几方面判断服务器/主机是否遭受DDoS攻击查看防火墙、流量监控设备、网络设备等是否出现安全告警或大量异常数据包。如图所示&#xff0c;通过流量对比&#xff0c;发现在异常时间段存在大量UDP数据包&#xff0c;并且与业务无关。 通过安全设…

猫毛还是满天飞?宠物空气净化器是个好帮手

家里养了几只可爱的小猫咪&#xff0c;每天都想它们贴贴&#xff0c;有时候看到它们这么可爱的待在家里&#xff0c;都不想出门上班了。每天睁眼是它们&#xff0c;闭眼前也是它们&#xff0c;只要我待在家里&#xff0c;它们就和我一起挪动&#xff0c;好像身边多了几只可爱的…