算法:前缀和算法模版

一维前缀和

题目

链接:一维前缀和模版题

在这里插入图片描述


思路分析

一:暴力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.mzph.cn/pingmian/55637.shtml

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

相关文章

KiCad 综合笔记

开窗 选中顶层或者底层 Mask 层&#xff0c;然后进行覆铜&#xff1a; 四层板 KiCad Tutorial - How to make a 4 layer PCB https://bbs.elecfans.com/jishu_2365544_1_1.html 虽然在“电路板设置”中&#xff0c;可以选择铜层的类型&#xff0c;但如果选择了“电源层”&am…

Pikachu-SSRF(curl / file_get_content)

SSRF SSRF是Server-side Request Forge的缩写&#xff0c;中文翻译为服务端请求伪造。产生的原因是由于服务端提供了从其他服务器应用获取数据的功能且没有对地址和协议等做过滤和限制。常见的一个场景就是&#xff0c;通过用户输入的URL来获取图片。这个功能如果被恶意使用&am…

Ascend C 自定义算子开发:高效的算子实现

Ascend C 自定义算子开发&#xff1a;高效的算子实现 在 Ascend C 平台上&#xff0c;开发自定义算子能够充分发挥硬件的性能优势&#xff0c;帮助开发者针对不同的应用场景进行优化。本文将以 AddCustom 算子为例&#xff0c;介绍 Ascend C 中自定义算子的开发流程及关键技术…

Mysql数据库原理--查询收尾+索引+事务

文章目录 1.查询收尾1.1自查询1.2合并查询 2.索引事务2.1约束自动生成索引2.2create手动添加索引2.3.删除手动创建的索引2.4索引背后的数据结构2.5B树的结构特点和优点--经典面试题 3.事务--经典面试题3.1基本理解3.2事务的特性3.3隔离级别 1.查询收尾 1.1自查询 子查询就是套…

《CUDA编程》6.CUDA的内存组织

前面几章讲了一些编写高性能CUDA程序的要点&#xff0c;但还有很多其他需要注意的&#xff0c;其中最重要的就是合理的使用设备内存 1 CUDA的内存组织简介 现代计算机中的内存存在一种组织结构(hierachy)&#xff0c;即不同类型的内存具有不同的容量和访问延迟&#xff08;可以…

力扣203.移除链表元素

题目链接&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6…

PDF怎么转换成TXT文本?这4个方法简单还免费,pdf转txt就靠它!

PDF怎么转换成TXT文本&#xff1f;PDF文件虽然广泛支持&#xff0c;但在某些设备或软件上可能无法完全正确显示&#xff0c;尤其是当文件包含特殊字体或复杂布局时。此外&#xff0c;PDF文件的阅读体验也可能受到格式干扰&#xff0c;如复杂的背景颜色或字体样式。将PDF转换为T…

IDEA几大常用AI插件

文章目录 前言列表GPT中文版TalkXBito AIIDEA自带的AI 前言 最近AI、GPT特别火&#xff0c;IDEA里面又有一堆插件支持GPT&#xff0c;所以做个专题比较一下各个GPT插件 列表 先看idea的plugins里支持哪些&#xff0c;搜索“GPT”之后得到的&#xff0c;我用下来感觉第一第二和…

阿里云云虚拟主机SSL证书安装指南

在安装SSL证书的过程中&#xff0c;您需要确保已经正确获取了SSL证书文件&#xff0c;并且能够访问阿里云云虚拟主机的管理页面。以下是详细的步骤说明&#xff1a; 第一步&#xff1a;准备SSL证书 申请SSL证书&#xff1a;访问华测ctimall网站&#xff08;https://www.ctimal…

Unite Barcelona主题演讲回顾:深入了解 Unity 6

本周&#xff0c;来自世界各地的 Unity 开发者齐聚西班牙巴塞罗那&#xff0c;参加 Unite 2024。本次大会的主题演讲持续了一个多小时&#xff0c;涵盖新功能的介绍、开发者成功案例的分享&#xff0c;以及在编辑器中进行的技术演示&#xff0c;重点展示了 Unity 6 在实际项目中…

Java | Leetcode Java题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; class Solution {public boolean circularArrayLoop(int[] nums) {int n nums.length;for (int i 0; i < n; i) {if (nums[i] 0) {continue;}int slow i, fast next(nums, i);// 判断非零且方向相同while (nums[slow] * nums[fast]…

游戏开发指南:使用 UOS C# 云函数快速构建与部署服务端逻辑实战教学

零基础的服务端小白&#xff0c;现在也可以使用 Unity 结合 C# 来轻松搞定游戏服务端啦&#xff01; 在本篇文章中&#xff0c;我们将以游戏中的“抽卡”功能为例&#xff0c;展示如何使用 Unity Online Services&#xff08;UOS&#xff09;提供的强大 C# 云函数服务&#xf…

如何革新源代码保密?七大方法教你应对!

在数字化时代&#xff0c;源代码的安全保密对于企业而言至关重要&#xff0c;它不仅关系到企业的核心竞争力&#xff0c;还涉及到知识产权的保护。源代码一旦泄露&#xff0c;可能会给企业带来无法估量的损失。因此&#xff0c;采取有效的源代码保密措施&#xff0c;是每个企业…

焊接缺陷分割系统源码&数据集分享

焊接缺陷分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-DiverseBranchBlock&#xff06;yolov8-seg-C2f-DCNV3等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI…

爱心曲线公式大全

local r a*((math.sin(angle) * math.sqrt(math.abs(math.cos(angle)))) / (math.sin(angle) 1.4142) - 2 * math.sin(angle) 2) local x r * math.cos(angle) -- 计算对应的x值 local z r * math.sin(angle) 1.5*a - --曲线公式绘画 local function generateParabola()…

【论文笔记】Flamingo: a Visual Language Model for Few-Shot Learning

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Flamingo: a Visual Langu…

第十四章 Redis之全局唯一ID(分布式集群)

目录 一、概念 ‌二、全局唯一ID的生成方法‌ 三、Redis生成全局ID 3.1. 生成策略 3.2. 代码 一、概念 全局唯一ID是指在分布式系统中&#xff0c;每个实体都有一个唯一的标识符&#xff0c;确保在不同的节点或服务之间能够唯一标识一个实体。这种唯一性对于数据的一致性…

Vue项目开发注意事项

事项一&#xff1a;项目代码放在本地怎么运行起来 1、首先确定项目对应的node和npm版本 node下载地址 Index of /dist/https://nodejs.org/dist/ node 与 npm版本对应关系 Node.js — Node.js Releases 2、node卸载的时候&#xff0c;会自动把对应的npm卸载掉 情况1&…

2024-你自学网络安全的顺序可能一直是反的!

作为一名在网络安全领域工作了八年的技术人员&#xff0c;我想分享一些经验给2024年学习黑客技术的朋友们。 千万不要毫无基础就开始学黑客!一定要先了解相关的信息和知识! 对于刚入行的朋友&#xff0c;我建议先从网络安全或Web安全/渗透测试入手&#xff0c;这些方向市场需求…

【优选算法】(第二十八篇)

目录 K个⼀组翻转链表&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 两数之和&#xff08;easy&#xff09; 题目解析 讲解算法原理 编写代码 K个⼀组翻转链表&#xff08;hard&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;Leet…