前缀和、差分模板(C++ 一维、二维)

news2024/12/23 17:26:47

      前缀和(Prefix Sum)和差分(Difference)是两种常用的数组操作,用于解决一些求和、求区间和、区间修改等问题。

     前缀和是指一个数组中每个位置上的元素与它前面位置上所有元素的和。例如,数组nums=[1, 2, 3, 4, 5]的前缀和数组为prefix=[1, 3, 6, 10, 15],其中prefix[i]表示nums中前i个元素的和。我们可以通过一次遍历数组来计算前缀和,时间复杂度为O(n)。

差分是指一个数组中每个位置上的元素与它前面位置上的元素的差。例如,数组nums=[1, 2, 3, 4, 5]的差分数组为diff=[1, 1, 1, 1, 1],其中diff[i]表示nums中第i个元素与第i-1个元素的差。我们可以通过一次遍历数组来计算差分,时间复杂度为O(n)。

      前缀和和差分可以相互转换。给定一个前缀和数组prefix,我们可以通过计算差分数组diff来还原原始数组nums。具体方法是,我们可以通过一次遍历prefix计算diff数组,其中diff[i]=prefix[i]-prefix[i-1](特别地,diff[0]=prefix[0])。给定一个差分数组diff,我们可以通过计算前缀和数组prefix来还原原始数组nums。具体方法是,我们可以通过一次遍历diff计算prefix数组,其中prefix[i]=prefix[i-1]+diff[i](特别地,prefix[0]=diff[0])。

     前缀和和差分的应用非常广泛。其中,前缀和可以用于快速计算数组中某个区间的和,时间复杂度为O(1)。差分可以用于快速修改数组中某个区间的元素。通过修改差分数组,我们可以在O(1)的时间内完成区间修改操作。总之,前缀和和差分是编程中非常有用且灵活的数组处理技巧。

一维前缀和: 

#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+10;
int n,q;
long long a[N],sum[N];
int main()
{
    memset(sum,0,sizeof(sum));
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum[i]=sum[i-1]+a[i];
    }
    while(q--)
    {
        int a,b;
        cin>>a>>b;
        cout<<sum[b]-sum[a-1]<<endl;
    }
    
}

二维前缀和:

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

一维差分:

#include<iostream>
using namespace std;
const int N=1e5+10;
int n,m;
long long a[N],dp[N];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        dp[i]=a[i]-a[i-1];
    }
    while(m--)
    {
        int a,b,k;
        cin>>a>>b>>k;
        dp[a]+=k;
        dp[b+1]-=k;
    }
    for(int i=1;i<=n;i++)
    {
        dp[i]+=dp[i-1];
        cout<<dp[i]<<" ";
    }
    
}

 二维差分:

#include<iostream>//从三个方向来加
using namespace std;
const int N=1e4+10;
int n,m,q,x1,x2,y1,y2,k;
long long a[N][N],dp[N][N],ans[N][N];
/*
k 。
。。-k
 -k k
*/
int main()
{
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
           cin>>a[i][j];
    while(q--)
    {
        cin>>x1>>y1>>x2>>y2>>k;
        dp[x1][y1]+=k;
        dp[x1][y2+1]-=k;
        dp[x2+1][y1]-=k;
        dp[x2+1][y2+1]+=k;
    }
    for(int i=1;i<=n;i++)
    {
          for(int j=1;j<=m;j++)
    {
        ans[i][j]=dp[i][j]+ans[i-1][j]+ans[i][j-1]-ans[i-1][j-1];
            cout<<a[i][j]+ans[i][j]<<" ";
    }
        cout<<endl;
    }
}

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

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

相关文章

打造智能语音机器人-用语音控制机器人

人工智能现已成为国家发展重大战略&#xff0c;智能语音技术作为人工智能产业链上的关键一环&#xff0c;AI应用成熟的技术之一&#xff0c;人工智能的发展也进入了一个崭新的阶段。那么打造智能语音机器人怎样实现用语音控制机器人呢&#xff1f;和小编一起来看看。 选择合适的…

【OceanBase诊断调优 】—— 如何快速定位SQL问题

作者简介&#xff1a; 花名&#xff1a;洪波&#xff0c;OceanBase 数据库解决方案架构师&#xff0c;目前负责 OceanBase 数据库在各大型互联网公司及企事业单位的落地与技术指导&#xff0c;曾就职于互联网大厂和金融科技公司&#xff0c;主导过多项数据库升级、迁移、国产化…

内推米哈游(原神),38岁被拒。。。

内推米哈游&#xff0c;被拒 今天逛职场 App 无意看到一条和米哈游&#xff08;原神&#xff09;相关的帖子。 楼主说前同事跳槽去了米哈游&#xff0c;因为之前合作过&#xff0c;彼此熟悉&#xff0c;主动联系自己说&#xff0c;想要帮忙内推。 当时 38 岁的楼主&#xff0c;…

【Linux系统编程】基本指令(一)

目录 1、ls指令 2、pwd指令 3、cd指令 4、touch指令 5、mkdir指令 6、rmdir指令与rm指令 7、man指令 8、cp指令 指令就像刚学windows时学的单击、双击一样&#xff0c;都是操作操作系统 在windows下&#xff0c;文件通常会放在文件夹中&#xff0c;而Linux中同样有文件…

vue 项目关于不同分辨率的电脑网页适配方案

流式布局&#xff1a;这是一种相对灵活的布局方式&#xff0c;页面的元素宽度使用相对宽度&#xff08;例如百分比&#xff09;来定义&#xff0c;而不是使用绝对宽度&#xff08;例如像素&#xff09;。这样&#xff0c;当浏览器窗口大小变化时&#xff0c;元素会自动调整大小…

MySQL B+索引的工作原理及应用

引言 在数据库系统中&#xff0c;索引是优化查询、提高性能的关键技术之一。特别是在MySQL数据库中&#xff0c;B树索引作为最常用的索引类型&#xff0c;对数据库性能有着至关重要的影响。本文旨简单解析MySQL中B树索引的工作原理&#xff0c;帮助学生朋友们更好地理解和利用…

axios——503响应超时重复多次请求——技能提升

今天在写后台管理系统时&#xff0c;遇到一个问题&#xff0c;就是每天早上一启动项目&#xff0c;接口会提示503超时&#xff0c;因此项目运行必须重新刷新请求成功后才可以正常使用。 后端同事说请求超时了&#xff0c;需要前端处理一下&#xff0c;如果是503的状态码&#…

GEM TSU Interface Details and IEEE 1588 Support

摘要&#xff1a;Xilinx ZNYQ ULTRASCALE MPSOC的GEM和1588的使用 对于FPGA来说&#xff0c;只需要勾选一些znyq的配置就行了&#xff0c;其余的都是软件的工作&#xff1b; 所有配置都勾选之后&#xff0c;最终会露出来的接口如下&#xff1a; GEM需要勾选的配置如下&#xf…

如何在CentOS本地搭建DataEase数据分析服务并实现远程查看数据分析

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

Python基础10-使用正则表达式进行文本处理

在编程过程中&#xff0c;我们经常需要对文本进行处理&#xff0c;以提取、替换或分割特定的字符串。正则表达式&#xff08;Regular Expression&#xff09;是一种强大的文本处理工具&#xff0c;它可以帮助我们实现这些任务。以下是使用正则表达式进行文本处理的一些基本方法…

羊大师讲解五一假期,探索羊奶的健康奥秘

羊大师讲解五一假期&#xff0c;探索羊奶的健康奥秘 随着五一假期的到来&#xff0c;许多人选择出游、休息或与家人共度美好时光。在这个特别的时刻&#xff0c;我们或许可以停下来&#xff0c;探索一种营养丰富、历史悠久的饮品——羊奶。 羊奶&#xff0c;作为大自然赐予我…

LeetCode in Python 74/240. Search a 2D Matrix I/II (搜索二维矩阵I/II)

搜索二维矩阵I其实可以转换为搜索一维数组&#xff0c;原因在于&#xff0c;只要先确定搜索的整数应该在哪一行&#xff0c;即可对该行进行二分查找。 搜索二维矩阵II中矩阵元素排列方式与I不同&#xff0c;但思想大致相同。 目录 LeetCode in Python 74. LeetCode in Pyth…

Qt | QAbstractButton 抽象类

QAbstractButton 类中的属性 ①、autoExclusive:bool 访问函数:bool autoExclusive() const; void setAutoExclusive(bool); 描述了按钮的自动排他性,若启用了该属性,则属于同一父部件的可选中按钮的行为, 就好像是在同一排他性组中的按钮一样。除了单选按钮,默认为关…

如何进行域名解析?如何清理DNS缓存?(附源码)

目录 1、什么是域名&#xff1f; 2、为什么使用域名&#xff1f; 3、域名解析的完整流程 4、调用gethostbyname系统接口将域名解析成IP地址 5、为什么需要清理系统DNS缓存&#xff1f; 6、使用cmd命令清理DNS缓存 7、通过代码去清除系统DNS缓存 C软件异常排查从入门到精…

数据结构---线性表(顺序表)附代码

目录&#xff1a; 数据结构相关概念 1、什么是数据结构&#xff1f; 2、为什么需要数据结构&#xff1f; 顺序表 1、顺序表的概念及结构 1.1 线性表 1.2 顺序表 2、顺序表分类 3、动态顺序表的实现 什么是数据结构&#xff1f;&#xff1f; 数据结构是由 “数据”和 …

Redis高级篇详细讲解

0.今日菜单 Redis持久化【理解】 Redis主从 Redis哨兵 Redis分片集群【运维】 单点Redis的问题 数据丢失问题&#xff1a;Redis是内存存储&#xff0c;服务重启可能会丢失数据 并发能力问题&#xff1a;单节点Redis并发能力虽然不错&#xff0c;但也无法满足如618这样的高…

用不了ChatGPT?快试试免费又强大的Anthropic Claude

一、Claude 简介 Anthropic 官方&#xff1a; https://www.anthropic.com/product Claude 是最近新开放的一款 AI 聊天机器人&#xff0c;是世界上最大的语言模型之一&#xff0c;比之前的一些模型如 GPT-3 要强大得多&#xff0c;因此 Claude 被认为是 ChatGPT 最有力的竞争…

C语言:一维数组、二维数组、字符数组介绍

数组 介绍一维数组定义应用方法初始化 举例示例结果 二维数组定义应用方法初始化 举例示例结果 字符数组定义应用方法初始化 举例示例结果分析 介绍 在C语言中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储一系列相同类型的数据。数组可以是多维的&#xff0c;最…

助力企业挖掘市场商机,赛盈分销与UseePay联合举办家居用品DTC品牌出海峰会!

随着中国经济的井喷式发展以及政策的扶持与完善下&#xff0c;中国家居品牌在全球市场上的实力不断被夯实&#xff0c;国内家居品牌数量不仅激增&#xff0c;商品也更加深远持久影响着海外消费者的生活。 中国家居企业出海之路曾陷入危机当中&#xff0c;而2023年年终的经济复苏…

多行Textview 计算切分后的长度,并回退长度

实现类似的效果&#xff0c;一个多行的 textview&#xff0c; 如果赋值一个超长的字符&#xff0c;尾部长度回退部分&#xff0c;并添加 ... 最后添加一个详情按钮。 如果不超长则不显示详情 效果如图&#xff1a; 获取截断之后的字符长度 fun getLimitedCharacterCount(textV…