什么是前缀和

前缀和(Prefix Sum)的定义为:对于一个给定的数列 A, 它的前缀和数列 S 是通过递推能求出来得   部分和。

例如:

C++实现

//假设数组a和前缀和数组s都已经定义
int i;
//初始条件
a[0] = 0;
s[0] = 0;
for (i=1; i<=n; i++) {cin >> a[i];s[i] = s[i-1] + a[i];
}

模板题

下面我们用一个模板题,将完整的一维数组前缀和做一个简单的展示。题目链接http://47.110.135.197/problem.php?id=5181。

#include <bits/stdc++.h>using namespace std;int main() {int n;cin >> n;int data;int ans[102] = {};for (int i=1; i<=n; i++) {cin >> data;ans[i] = ans[i-1] + data;}for (int i=1; i<=n; i++) {cout << ans[i] << " ";}cout << endl;return 0;
}

用途

前缀和是一种重要的预处理,能大大降低查询的时间复杂度。

前缀和是以求和的方式灵活地面对区间询问。

下面我们用一个模板题来说明。

例题:区间求和

给你一串长度为 n 的数列 a1, a2, a3, ..., an,再给出 m 个询问,每次询问给出 L, R 两个数,要求给出区间 [L, R] 里的数的和。

详细可以参看http://47.110.135.197/problem.php?id=5139。

题目分析

题目非常简单,我们也可以得到一个最简单的解法,暴力操作。也就是对应每个询问,我们都从 L 开始到 R 结束对这个区间的数据进行求和。基本的代码如下:

#include <iostream>using namespace std;const int MAXN = 1e5+2;
long long arr[MAXN] = {};int main() {int n;cin >> n;int i, j;for (i=1; i<=n; i++) {cin >> arr[i];}int m;int l, r;long long ans = 0;cin >> m;for (i=0; i<m; i++) {cin >> l >> r;ans = 0;for (j=l; j<=r; j++) {ans += arr[j];}cout << ans << endl;}return 0;
}

代码分析

从上面的代码非常明确的分析出来,代码的时间复杂度为 。也就是说,在比赛中这样的解法能否 AC,那就要看数据的量了。当然我们都知道这样的解法,比赛中是肯定不可能 AC。因此唯一的可能就是降低时间复杂度。方法就是使用前缀和。

我们先看前缀和的数学。数列A中某个下标区间 [l, r] 内的数的和定义为:

从上面推导,我们可以清晰的看出,前缀和和区间和的关系。

代码改进

#include <iostream>using namespace std;const int MAXN = 1e5+2;
long long arr[MAXN] = {};
long long sum[MAXN] = {};int main() {int n;cin >> n;int i, j;for (i=1; i<=n; i++) {cin >> arr[i];sum[i] = sum[i-1] + arr[i];}int m;int l, r;cin >> m;for (i=0; i<m; i++) {cin >> l >> r;cout << sum[r] - sum[l-1] << endl;}return 0;
}

代码分析

从上面的代码非常明确的分析出来,代码的时间复杂度为

前缀和——(1)什么是前缀和和一维前缀和相关推荐

  1. 模版 ----- 一维前缀和与二维前缀和

    一维前缀和 795. 前缀和 a[i] 的前 i 项和 s[i] 的递推公式:s[i]=s[i−1]+a[i]s[i] = s[i - 1] + a[i]s[i]=s[i−1]+a[i] 求出在 [l ...

  2. 修改mysql表前缀_使用phpMyAdmin批量修改Mysql数据表前缀的方法

    多个网站共用一个Mysql数据库时,为使数据库管理不混乱,一般采用不同的网站使用不同前缀名的方式进行区分.而如何批量修改已有数据库的前缀名呢?全部导出修改后再导入?还是一个表一个表的修改?今天我要介绍 ...

  3. 一维前缀和,二维前缀和,一维差分,二维差分(翻译)

    练习一道题目 输入一个长度为n的整数序列. 接下来再输入m个询问,每个询问输入一对l, r. 对于每个询问,输出原序列中从第l个数到第r个数的和. 输入格式 第一行包含两个整数n和m. 第二行包含n个 ...

  4. [一维前缀和]leetcode303:区域和检索 - 数组不可变(easy)

    题目: 题解: 一维前缀和,元素数组[0,j]的前缀和对应prefix[j+1] 代码如下: class NumArray {private:vector<int> prefix; pub ...

  5. 一维前缀和与二维前缀和

    前缀和 #一维前缀和: 1) 其实就是数列的前n项和,直接放代码:` sum[1]=a[1];for(int i=2;i<=n;i++)sum[i]=sum[i-1]+a[i];/*其实也可以不 ...

  6. GDUT - 专题学习1 D - 一维前缀和

    D - 一维前缀和 题目 一天,在宿舍睡觉的你,突然梦到了游戏之神,他说:去玩<极限脱出>吧,这部作品的剧情和世界观绝对会带来很大的震撼,值得一玩. 对了,这部作品的第一代发布在nds上, ...

  7. 【题集】一维前缀和-二维前缀和-数星星问题-反复运行时如何降低时间复杂度

    目录 1前缀和 1.1一维前缀和 1.2二维前缀和 2.题目 2.1输入描述: 2.2输出描述: 2.3输入 2.4输出 3.题目理解 3.1思路 4.程序 4.1运行结果 1前缀和 1.1一维前缀和 ...

  8. 【算法】前缀和(一维前缀和与二维前缀和)

    前缀和是一种重要的预处理,能大大降低查询的时间复杂度. [一维前缀和] 给定一个数组A[1,2,--n],则它的前缀和数组为PrefixSum[1..n].定义为:PrefixSum[i] = A[0 ...

  9. 期望dp ---- E. Vasya and Magic Matrix(二维转一维+前缀和优化的期望dp)

    题目链接 题目大意: 解题思路: 首先我们先把二维矩阵变成一维的(x,y)→(x−1)⋅m+y(x,y)\rightarrow(x-1)\cdot m+y(x,y)→(x−1)⋅m+y 然后对每个点按 ...

  10. python【数据结构与算法】一维前缀和与差分

    文章目录 概述 1 前缀和 1.1模板 1.2 板子题 2 差分 2.1 模板 2.2 板子题 概述 前缀和是一种重要的预处理,能大大降低查询的时间复杂度,而差分则是一种和前缀和相对的策略. 1 前缀 ...

最新文章

  1. DNS服务器分离解析 RAID阵列 进程管理 日志管理 systemd作用
  2. Linux上DNS实现工具之bind详叙
  3. C# vb.net 分别引用C++编译DLL
  4. iOS - CALayer 绘图层
  5. python-opencv学习第二章
  6. Oracle:数据类型速记
  7. SSM三大框架超详细总结(适合你重新回顾)
  8. window.location.search 跳转
  9. 如何编写有效的Bug Report
  10. logstash收集nginx日志
  11. Windows Server 2008 R2入门之FTP服务器
  12. 《Adobe Fireworks CS5中文版经典教程》——1.2 工具面板
  13. Python +Tesseract白嫖武动乾坤番外篇最终章文字版
  14. 被新手忽视的 自谐振频率点
  15. Windows高级工程师:GDI+绘图;基础入门大全
  16. Codeforces Round #772 (Div. 2) CF1635ABCDEF
  17. Xtrabackup 增量备份
  18. 【刷题日记】网易——瞌睡
  19. 关于数值策划在使用Excel表时的一点想法
  20. crypto091-airdrop(网鼎杯2022)

热门文章

  1. Linux系统之iftop的基本使用
  2. python格式化千分位数字
  3. nodejs 判断是文件夹还是文件
  4. 海康威视摄像机的实时读取篇一(OpenCV开发环境配置)
  5. 颜色相关直方图(color correlogram)
  6. 正则表达式替换某个字符
  7. day9-数据库操作与Paramiko模块
  8. 安防工程属于计算机系统集成的文件,安防系统集成(工程)市场规模为960亿元
  9. 生态系统名词解释笔记
  10. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part3