当前位置: 首页 > news >正文

C/C++ 前缀和与差分

个人主页:仍有未知等待探索_C语言疑难,数据结构,算法-CSDN博客

专题分栏:算法_仍有未知等待探索的博客-CSDN博客

目录

一、前言

1、什么是前缀和

2、什么是差分

3、优势

1.朴素做法:

2.用差分数组

二、代码实现

1、给一个数组去求其差分数组

2、给一个数组去求其前缀和数组


一、前言

1、什么是前缀和

前缀和是一种预处理,用于降低查询时的时间复杂度。其就像是数学中的前n项和。

给定 n个整数,然后进行 m 次询问,每次询问求一个区间内值的和。

如果用暴力写法,那每次询问都需要从区间左端点循环到区间右端点求和,时间复杂度较大。

这种时候就可以预先求出该数组的一维前缀和。

比如说数组【1,1,1,1,1】,则前缀和数组就是【1,2,3,4,5】。

2、什么是差分

差分更像是前缀和数组的原数组。

比如说前缀和数组是【1,2,3,4,5】,则差分数组就是【1,1,1,1,1】。

总结一句话:前缀和和差分是互逆运算。

3、优势

如果让你把数组的一个子区间全都加上一个数 c,并且去对改区间进行求和。

1.朴素做法:

  • 找到该区间,然后对每个数进行相加 c
  • 在遍历一遍进行求和

如果要加数的区间多,求和的区间多的话,时间太长。

2.用差分数组

  • 找到要加数的区间左端点,然后仅对左端点进行加 c 操作(在左端点的右侧,其前缀和数组均加上了 c)
  • 但是我们想加数的范围仅在某一个区间,这样的话我们就对其右端点+1进行-c操作,这样就行了

二、代码实现

注意:数组一定要从1开始进行存储,要不然求前缀和数组的时候还要特判。

1、给一个数组去求其差分数组

#include<iostream>
using namespace std;const int N = 1e5 + 5;
int a[N];//原数组
int b[N];//差分数组
int n;//数的个数//可以将求一个差分数组,分成求1个元素的差分数组
void insert (int c,int i)
{b[i] += c;b[i + 1] -= c;
}
int main()
{cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i <= n; i++) insert(a[i], i);for (int i = 1; i <= n; i++) cout << b[i] << " ";return 0;
}

2、给一个数组去求其前缀和数组

#include<iostream>
using namespace std;const int N = 1e5 + 5;
int n;//数的个数
int a[N];//原数组
int s[N];//前缀和数组int main() {cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i <= n; i++) {s[i] = s[i - 1] + a[i];//每一个前缀和数组元素一定是它前一个前缀和数组元素加上自己的元素}for (int i = 1; i <= n; i++) {cout << s[i] << " ";}return 0;
}

谢谢大家的支持!

相关文章:

  • 基于单片机的智能健康监测手环的设计
  • Python数据科学视频讲解:数据清洗、特征工程和数据可视化的注意事项
  • 【从零开始学习JVM | 第一篇】快速了解JVM
  • mysql中NULL值
  • 设计模式——单例模式(Singleton Pattern)
  • 基于单片机音乐盒仿真仿真系统设计
  • css实现头部占一定高度,内容区占剩余高度可滚动
  • Qt 容器QGroupBox带有标题的组框框架
  • SpringBoot集成Elasticsearch8.x(9)|(RestClient实现Elasticsearch DSL操作)
  • deepface:实现人脸的识别和分析
  • 3GPP标准查看、下载和几个UE相关系列标准
  • Transformer源码(带注释)
  • 机器学习中Fine-tuning应用实例
  • nginx配置正向代理支持https
  • 判断上三角矩阵
  • 2019.2.20 c++ 知识梳理
  • Electron入门介绍
  • idea + plantuml 画流程图
  • Js基础——数据类型之Null和Undefined
  • magento 货币换算
  • Rancher如何对接Ceph-RBD块存储
  • windows下使用nginx调试简介
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 缓存与缓冲
  • 基于HAProxy的高性能缓存服务器nuster
  • 如何使用 JavaScript 解析 URL
  • 使用 Docker 部署 Spring Boot项目
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 新书推荐|Windows黑客编程技术详解
  • 追踪解析 FutureTask 源码
  • const的用法,特别是用在函数前面与后面的区别
  • ​linux启动进程的方式
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (26)4.7 字符函数和字符串函数
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (分布式缓存)Redis分片集群
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (三)终结任务
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .Net面试题4
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @Bean, @Component, @Configuration简析
  • [ 数据结构 - C++] AVL树原理及实现
  • [] 与 [[]], -gt 与 > 的比较
  • [14]内置对象
  • [ACM] hdu 1201 18岁生日
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [codeforces] 25E Test || hash
  • [CSS] 点击事件触发的动画