算法:前缀和算法模版

一维前缀和

题目

链接:一维前缀和模版题

在这里插入图片描述


思路分析

一:暴力O(q * N)
对于每一次询问,我们都可以用一个循环计算[l,r]区间内的元素和,
时间复杂度,O(q * N)

每一次计算一个区间都需要去循环一次,这是不是非常的麻烦呢?
我们能不能想一个办法把这个某个区间的和给存起来呢?进行反复利用呢?

所以,就优化出了,前缀和算法

二:前缀和O(q + N)

我们可以预处理出一个dp数组,来存放[1,i]的区间的元素和

当我们需要求区间[l,r]的元素和的时候,就可以用dp[r] - dp[l - 1]
这样每次查询的时候,时间复杂度就是O(1)

那么我们怎么去预处理出这个dp数组呢?
我们可以用递推的思想,前n个元素的和等于前n-1个元素的和加上第n个元素的和
所以,dp[i[ = dp[i - 1] + arr[i]

细节:
这里的下标是从1,开始,如果从0开始需要对dp[0]特殊处理一下。


代码

#include <iostream>
#include <vector>using namespace std;int main() {int n ,q;cin >> n >> q;vector<int> a(n+1);vector<long long> dp(n+1);for(int i = 1;i < n + 1;i++){cin >> a[i];dp[i] = dp[i-1] + a[i]; }while(q--){int l,r;cin >> l >> r;cout << dp[r] - dp[l-1] << endl;}return 0;
}
// 64 位输出请用 printf("%lld")

二维前缀和

题目

链接:二维前缀和模版题

在这里插入图片描述


思路分析

暴力的时间复杂度是O(q * n2),很容易想,就不多叙述了。
直接讲一下二维前缀和算法的思路。

二维前缀和与一维前缀和类似,都是采用拼接的思路。
我们先预处理出来一个dp数组,用来存放从[1,1]到[i,j]这个矩阵内的元素和。

在这里插入图片描述
来,我们抽象出来一个矩阵,从[1,1]到[i,j]

如何去求这个区间的和呢?
很明显A + B + C + D对吧
但是B 和 C都不好求啊,
诶嘿,来,试试小学几何题常用的割补法。
我们可以将A+B看成一个整体,将A+C看成一个整体
那么A+B+C+D = (A+B)+(A+C)- A + D
具象到代码就是
dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + arr[i][j]

好,预处理完dp数组后,我们如何去使用dp数组去求任意一个矩阵的元素和呢?

假设我们就需要求D区间的元素和(假设左上顶点是x1,y1,右下顶点是x2,y2)
很容易想到的是,(A+B+C+D) - (A+B+C)
但是,和之前一样,B和C区间处理不了,依然采用割补法。
D = (A+B+C+D) - (A+B) - (A+C) + A
具象到代码就是
answer = dp[x2][y2] - dp[x1-1][y2] - dp[x2][y1-1] + dp[x1-1][y1-1]

此时的时间复杂度是O(N2 + q)

细节:下标也是从1开始,dp数组多开一个空间,开到n+1,m+1
如果下标是从0开始,需要对边界情况进行特殊处理


代码

#include <iostream>
#include <vector>
using namespace std;int main() {int n,m,q;cin >>n >> m>> q;vector<vector<int>> a(n+1,vector<int>(m+1));vector<vector<long long>> dp(n+1,vector<long long>(m+1));for(int i = 1;i<n+1;++i){for(int j = 1;j< m+1;++j){cin >> a[i][j];dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + a[i][j];}}while(q--){int x1,y1,x2,y2;cin >> x1 >> y1 >> x2 >>y2;cout << dp[x2][y2] - dp[x1-1][y2] - dp[x2][y1-1] + dp[x1-1][y1-1] << endl;}return 0;
}

国庆节结束了,我又回来啦,hhh,
继续更新!!!

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

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

相关文章

windows C++-创建图像处理的异步消息(二)

创建图像处理网络 此部分介绍如何创建对给定目录中的每个 JPEG (.jpg) 图像执行图像处理的异步消息块网络。 网络执行以下图像处理操作&#xff1a; 对于 Tom 创作的任何图像&#xff0c;转换为灰度。 对于任何以红色作为主色的图像&#xff0c;移除绿色和蓝色分量&#xff0…

如何避免PuTTY的连接超时

问题&#xff1a;使用PuTTY默认创建的SSH连接&#xff0c;过一会就会提示“Remote side unexpectedly closed network connection" 解决方法&#xff1a; 要防止PuTTY会话由于空闲而断开连接&#xff0c;可以通过启用keep-alives功能&#xff0c;使PuTTY定期向远程主机发…

2-116 基于matlab的主成分分析(PCA)及累积总和(CUSUM)算法故障监测

基于matlab的主成分分析&#xff08;PCA&#xff09;及累积总和&#xff08;CUSUM&#xff09;算法故障监测&#xff0c;针对传统的多元统计分析方法对生产过程中微小故障检测不灵敏的问题&#xff0c;使用基于主元分析的累积和的微小故障检测方法进行故障监测&#xff0c;通过…

【多重循环在Java中的应用】

多重循环在Java中的应用 介绍 多重循环是将一个循环嵌套在另一个循环体内的编程结构。Java中的 for、while 和 do...while 循环均可作为外层循环和内层循环。建议使用两层嵌套&#xff0c;最多不超过三层&#xff0c;以保持代码的可读性。 在多重循环中&#xff0c;外层循环执…

开源项目都是怎么推广的?

大家好&#xff0c;我是爱折腾的刘大逵。跟我接触过的技术们都知道&#xff0c;一年一年的都在折腾着做一些项目&#xff0c;年年有进步&#xff0c;年年有想法&#xff0c;年年在折腾。今天给大家分享GITEE如何上推荐&#xff01; GITEE推荐有什么用&#xff1f; 众所周知&a…

DDD简介

概述 传统的数据驱动开发模式&#xff0c;View、Service、Dao这种三层分层模式&#xff0c;会很自然的写出过程式代码&#xff0c;这种开发方式中的对象只是数据载体&#xff0c;而没有行为&#xff0c;是一种贫血对象模型。以数据为中心&#xff0c;以数据库ER图为设计驱动&a…

回到原点再出发

原文What Goes Around Comes Around作者Michael Stonebraker & Joseph M. Hellerstein其他译文https://zhuanlan.zhihu.com/p/111322429 1. 摘要 本文总结了近35年来的数据模型方案&#xff0c;分成9个不同的时代&#xff0c;讨论了每个时代的方案。我们指出&#xff0c;…

Linux安装配置Jupyter Lab并开机自启

文章目录 1、安装配置jupyter lab首先需要使用pip3安装&#xff1a;生成配置文件和密码&#xff1a; 2、设置开机自启首先通过which jupyter查询到可执行文件路径&#xff1a;设置自启服务&#xff1a; 1、安装配置jupyter lab 首先需要使用pip3安装&#xff1a; pip3 instal…

(22)以RS码为例说明信道编码AWGN信道的Eb/N0设置

文章目录 前言一、编码Eb/N0与未编码Eb/N0及编码码率二、仿真代码三、仿真结果 前言 本文说明了如何为采用信道编码的通信链路设置Eb/N0&#xff08;比特能量与噪声功率谱密度比&#xff09;。 一、编码Eb/N0与未编码Eb/N0及编码码率 在通信系统仿真中&#xff0c;如果采用了…

10.8摩尔学习知识点

今天学习获取数据 在摩尔云平台找到要修改的主视图&#xff0c;然后点击操作功能&#xff0c;点击新增&#xff0c;直接输入名字获取数据&#xff0c;然后&#xff0c;显示顺序15&#xff0c;显示是&#xff0c;点击确定&#xff0c;然后就是自定义类上面输入创建的类名&#…

怎么在抖音直播间录屏?主播会知道吗?录屏软件推荐

在抖音直播间录屏&#xff0c;主播通常不会收到直接通知提示某个观众正在录屏。在抖音直播间录屏&#xff0c;主播通常是不知道的。抖音平台没有为主播提供查看观众录屏行为的相关功能或提示&#xff0c;所以从平台功能角度来说&#xff0c;主播无法直接察觉观众的录屏操作。 然…

『网络游戏』窗口基类【06】

创建脚本&#xff1a;WindowRoot.cs 编写脚本&#xff1a; 修改脚本&#xff1a;LoginWnd.cs 修改脚本&#xff1a;LoadingWnd.cs 修改脚本&#xff1a;ResSvc.cs 修改脚本&#xff1a;LoginSys.cs 运行项目 - 功能不变 本章结束

职场中的人情世故,你懂了多少?

职场如战场&#xff0c;稍有不慎&#xff0c;满盘皆输。 职场如江湖&#xff0c;不是打打杀杀&#xff0c;而是人情世故。 成年人的世界里没有“容易”二字&#xff0c;我们也需要懂得哪些人情世故和。 职场上的各种光怪陆离现象&#xff0c;有很多职场人吐槽&#xff1a;“…

以后再也不要说程序员不能拿诺贝尔了

当地时间10月8日&#xff0c;瑞典皇家科学院宣布&#xff0c;将2024年诺贝尔物理学奖授予美国普林斯顿大学的约翰霍普菲尔德&#xff08;John J. Hopfield&#xff09;和加拿大多伦多大学的杰弗里辛顿&#xff08;Geoffrey E. Hinton&#xff09;&#xff0c;以表彰他们“为推动…

基于SSM车位租赁系统【附源码】

基于SSM车位租赁系统 效果如下&#xff1a; 注册页面 首页展示 车位租赁订单展示 车位列表页面 公告信息管理页面 公告类型管理界面 研究背景 随着经济的持续增长和城市化进程的加速&#xff0c;土地资源变得日益紧缺&#xff0c;停车难问题已成为许多城市面临的共同挑战。随…

力扣LeetCode-链表中的循环与递归使用

标题做题的时候发现循环与递归的使用差别&#xff1a; 看两道题&#xff1a; 两道题都是不知道链表有多长&#xff0c;所以需要用到循环&#xff0c;用到循环就可以把整个过程分成多个循环体&#xff0c;就是每一次循环要执行的内容。 反转链表&#xff1a; 把null–>1…

OpenFegin

文章目录 一、OpenFegin是什么&#xff1f;二、基本使用三、超时重试机制4.自定义超时重传机制五、底层实现 一、OpenFegin是什么&#xff1f; OpenFeign的全称为Spring Cloud OpenFeign(下文简称OpenFeign),是Spring Cloud团队开发的一款基于 Feign的框架&#xff0c;声明式W…

『网络游戏』Tips弹窗队列【10】

修改脚本&#xff1a;DynamicWnd.cs 修改脚本&#xff1a;GameRoot.cs 运行项目 - Tips提示消息按顺序依次弹出显示 修改代码&#xff1a;GameRoot.cs 修改代码&#xff1a;LoginSys.cs 运行项目 设置初始化函数 将CreateWnd设置为隐藏 运行项目 本章结束

Python爬虫之正则表达式于xpath的使用教学及案例

正则表达式 常用的匹配模式 \d # 匹配任意一个数字 \D # 匹配任意一个非数字 \w # 匹配任意一个单词字符&#xff08;数字、字母、下划线&#xff09; \W # 匹配任意一个非单词字符 . # 匹配任意一个字符&#xff08;除了换行符&#xff09; [a-z] # 匹配任意一个小写字母 […

【斯坦福CS144】Lab3

一、实验目的 完成 TCPSender 的四个接口。 二、实验内容 在该实验中&#xff0c;我们需要完成 TCPSender 的以下四个接口&#xff1a; **fill_window&#xff1a;**TCPSender 从 ByteStream 中读取数据&#xff0c;并以 TCPSegement 的形式发送&#xff0c;尽可能地填充接…