首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前缀和

前缀和

作者头像
lexingsen
发布于 2022-02-25 00:26:50
发布于 2022-02-25 00:26:50
72100
代码可运行
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客
运行总次数:0
代码可运行

问题描述,现在给定一个闭区间数组,求区间[l,r]的数据元素之和,询问m次,要求线性时间复杂度O(n)。 比较常规的思路是使用循环遍历相加,但是一次循环的时间复杂度为O(n),m次询问最终的时间复杂度为O(n*m),显然是不满足要求的。我们可以采用空间换时间的策略,设置一个前缀和数组d,数组中任意位置i表示的是d[i] = a[1] + a[2] + … + a[i],经过这样的预处理,询问任意位置的前缀和的时间复杂度变为O(1),经过m次询问,时间复杂度为O(m),符合要求。

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <bits/stdc++.h>
using namespace std;

const int N=1e5+10;
int a[N];
int d[N];

inline int read() {
  int x = 0;
  int f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch= getchar();
  }
  while (isdigit(ch)) {
    x = x*10 + ch-'0';
    ch = getchar();
  }
  return x * f;
}

int main() {
  int n = read(), m = read();
  for (int i=1; i<=n; ++i) a[i] = read();
  d[1] = a[1];
  for (int i=2; i<=n; ++i) 
    d[i] = d[i-1] + a[i];
  while (m --) {
    int a=read(), b=read();
    printf("%d\n", d[b]-d[a-1]);
  }
  return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前缀和、二维前缀和与差分的小总结
如果我给你一串长度为n的数列a1,a2,a3......an,再给出m个询问,每次询问给出L,R两个数,要求给出区间[L,R]里的数的和,你会怎么做,若是没有了解过前缀和的人看到这道题的想法可能是对于m次询问,我每次都遍历一遍它给的区间,计算出答案,这样子的方法固然没错,但是其时间复杂度达到了O(n*n),如果数据量稍微大一点就有可能超时,而我们如果使用前缀和的方法来做的话就能够将时间复杂度降到O(n+m),大大节省了运算时间。至于怎么用,请看下面一小段代码
ACM算法日常
2019/07/05
2.6K0
SP11444 MAXOR - MAXOR & bzoj 2741 【FOTILE模拟赛】L
给定一个长度为 n 的序列 a_i,有 m 个询问,查询一段区间内的子区间的异或和最大值。
yzxoi
2022/09/19
2680
SPOJTLE - Time Limit Exceeded(高位前缀和)
题意 题目链接 题目的意思是给一个数组C,长度为n,每个数字的范围是2^m,然后要求构造一个数组a,满足 1、a[i] % C[i] !=0 ; 2、a[i] < 2^m ; 3、a[i] & a[i+1] = 0; Sol 直接dp的话就是先枚举补集的子集,这样的复杂度是\(3^n\)的 然后补集的子集可以用高位前缀和优化一下 时间复杂度:\(O(2^n * n)\) #include<cstdio> #include<cstring> using namespace std; c
attack
2018/12/06
4420
BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 9894  Solved: 4561 [Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜
Angel_Kitty
2018/04/09
7310
LuoguP3793 由乃救爷爷
如果朴素分块肯定是不能过的 O(N\sqrt{N}),但是这题并没有修改操作,所以考虑先预处理出第 l 个块到第 r 个块的最大值、第 i 个块的前缀最大值、第 i 个块的后缀最大值。
yzxoi
2022/09/19
2580
LuoguP4119 [Ynoi2018] 未来日记
首先要对序列分块,对于整块,考虑直接把一种数字直接改成另一种数字,然后可以考虑使用并查集。对于散块,我们可以直接暴力枚举修改,暴力重构并查集即可。
yzxoi
2022/09/19
2300
【算法】前缀和与差分
前缀和可以快速求出原数组里面一段数的和。比如求一段区间[l,r],如果按照原来的做法,需要循环一遍,O(n),有前缀和的算法:
平凡的人1
2023/10/15
3570
【算法】前缀和与差分
浅谈莫队
1\leq n \leq 5\times 10^4,1\leq m \leq 2\times 10^5,0\leq a_i \leq 10^6
yzxoi
2022/09/19
5060
冲击蓝桥杯-并查集,前缀和,字符串
并查集合前缀,字符串和在往年考试出现频率不算太高,但也会涉及到,考察的时候往往结合一些其他知识带点一起考察,当然也不排除今年蓝桥杯会考察到,学一下也是未自己增加一份保险
莫浅子
2023/03/26
4300
冲击蓝桥杯-并查集,前缀和,字符串
枚举+优化(7)——前缀和1
例1  给定一个长度为N的数组:A1,A2,...,AN。(N <= 100000,1 <= A[i] <= 100000)。然后有M个询问,每次询问给两个整数L,R问A[L]~A[R]的和是多少。(M <= 100000)。  这道题最直接的做法就是每次询问的时候,用一个循环累加A[L]~A[R]的和,伪代码如下: Ask(L,R) Sum = 0 For i = L...R Sum += A[i] return Sum  上面这段伪代码,处理一个询问的时间复杂度是O(R-L),考虑到R最大是N
mathor
2018/06/19
6130
【算法/学习】前缀和&&差分
差分数组的好处是可以简化运算,例如想要给一个区间 [l,r] 上的数组加一个常数c,原始的方法是依次加上c,这样的时间复杂度是O(n)的。但是如果采用差分数组的话,可以大大降低时间复杂度到O(1)。
IsLand1314
2024/10/15
1730
【算法/学习】前缀和&&差分
P6774 [NOI2020] 时代的眼泪
给定长度为 n 的序列,其中第 i 个点的权值为 p_i,保证 p_i 为 [1,n] 的排列。
yzxoi
2022/09/19
3100
我爱学算法之—— 前缀和(上)
通过上图,我们可以发现:我们要求的[l , r]区间的和s就等于区间[1 , r]的和 减去区间[1 , l]的和。
星辰与你
2025/06/08
860
我爱学算法之—— 前缀和(上)
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
prefix表示前缀和,前缀和由一个用户输入的数组生成。对于一个数组a[](下标从1开始),我们定义一个前缀和数组prefix[],满足:
走在努力路上的自己
2024/03/04
3260
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
Day1上午解题报告
预计分数:100+60+0=160 实际分数:100+30+20=150 T1立方数(cubic) 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数。 现在给定一个数P,LYK想要知道这个数是不是立方数。 当然你有可能随机输出一些莫名其妙的东西来骗分,因此LYK有T次询问~ 输入输出格式 输入格式: 第一行一个数T,表示有T组数据。 接下来T行,每行一个数P。 输出格式: 输出T行,对于每个数如果是立方数,输出“YES
attack
2018/04/11
9130
【算法专题】前缀和
题目:给定一个长度为n的数组 a1​, a2​, …an. 接下来有q次查询, 每次查询有两个参数l, r. 对于每个询问, 请输出 al + al + 1 + … + ar
YoungMLet
2024/03/01
1900
【算法专题】前缀和
前缀和--详讲
T组数据,每组有N个数,然后给出R,L。目标是让你求出在区间[R,L]之间的和。(0<= R < L <=N)。
杨鹏伟
2020/09/11
4050
【优先算法】思还故里闾,欲归道无因 - 前缀和
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
用户11369350
2025/01/20
1010
【优先算法】思还故里闾,欲归道无因 - 前缀和
你所不知道的 KMP 冷知识
KMP算法由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。
ACM算法日常
2021/08/10
9040
【C++】前缀和算法专题
⽤ dp[i] 表⽰: [1, i] 区间内所有元素的和,那么 dp[i - 1] ⾥⾯存的就是 [1,i - 1] 区间内所有元素的和,那么:可得递推公式: dp[i] = dp[i - 1] +arr[i] ;
啊QQQQQ
2024/11/19
1520
【C++】前缀和算法专题
相关推荐
前缀和、二维前缀和与差分的小总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档