首页 > 其他分享 >前缀和(一维)

前缀和(一维)

时间:2023-10-17 11:35:01浏览次数:33  
标签:一维 前缀 int 复杂度 整数 数组 输入

一、算法描述

本篇文章我们来介绍一个简单的算法,前缀和。

什么是前缀和?

  • 前缀和是某一个序列的前n项的和,可以理解为数学上的数列的前n项和。

  • 如果 \(a\) 和 \(s\) 分别是原数组和前缀和数组,那么应该有如下关系:

    s[1] = a[1];s[2] = a[1] + a[2];s[3] = a[1] + a[2] + a[3];

如何得到前缀和?

  • 显然如果按照上面的累加法得到前缀和数组时间复杂度较大,所以我们换一个思路。

  • \(s[i]\) 表示的是前 \(i\) 项的和,那么要求前 \(i + 1\) 项的和,即 \(s[i + 1]\) ,只需要在 \(s[i]\) 的基础上加上 \(a[i + 1]\) 即可得到 \(s[i + 1]\) 了。

  • 所以可以得到递推关系式:s[i] = s[i - 1] + a[i];

前缀和有什么作用?

  • 当我们需要查询数组某段区间 \([l, r]\) 的和时,如果从 \(l\) 遍历到 \(r\) ,那么时间复杂度为 \(O(n)\) ,这个时候就可以用到前缀和的性质了。

  • \(s[r]\) 表示数组 \(a\) 的前 \(r\)项和,要求 \([l, r]\)区间内的和,只需要减去前 \(l - 1\) 项的和,即 \(s[l - 1]\) ,这样只需要 \(O(1)\)的时间复杂度就可以获取区间 \([l, r]\) 内的和。

二、题目描述

输入一个长度为 \(n\) 的整数序列。

接下来再输入 \(m\) 个询问,每个询问输入一对 \(l,r\)。

对于每个询问,输出原序列中从第 \(l\) 个数到第 \(r\) 个数的和。

输入格式

第一行包含两个整数 \(n\) 和 \(m\)。

第二行包含 \(n\) 个整数,表示整数数列。

接下来 \(m\) 行,每行包含两个整数 \(l\) 和 \(r\),表示一个询问的区间范围。

输出格式

共 \(m\) 行,每行输出一个询问的结果。

数据范围

\(1≤l≤r≤n,\)
\(1≤n,m≤100000,\)
\(−1000≤数列中元素的值≤1000\)

输入样例:

5 3
2 1 3 6 4
1 2
1 3
2 4 

输出样例:

3
6
10 

三、题目来源

AcWing算法基础课-795.前缀和

四、源代码

#include <iostream>

using namespace std;

const int N = 100010;

int n, m;
int a[N], s[N];

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)    cin >> a[i];
    for (int i = 1; i <= n; ++i)    s[i] = s[i - 1] + a[i];
    
    while (m -- )
    {
        int l, r;
        cin >> l >> r;
        
        cout << s[r] - s[l - 1] << endl;
    }
    
    return 0;
}

标签:一维,前缀,int,复杂度,整数,数组,输入
From: https://www.cnblogs.com/grave-master/p/17769223.html

相关文章

  • 二阶前缀和和二阶差分
    马上就要csps了还啥也不会,真就是酸菜鱼了。定义二阶差分就是在差分数组的基础上再做一次差分。举个很板的栗子就是对一个序列进行一个等差数列式的一个减法,这个时候我们可以通过二阶差分,在\(O(1)\)的复杂度进行修改,之后就是\(O(n)\)的二维前缀和,就可以维护出来我们的一个......
  • 14.最长公共前缀
    1.题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例1:输入:strs=["flower","flow","flight"]输出:"fl"示例2:输入:strs=["dog","racecar","car"]输出:""解释:输入不存在公共前缀。......
  • Day2 前缀和 差分 双指针
    前缀和LuoguP2004领地选择二维前缀和板题,注意开longlong#include<iostream>#include<cstdio>#include<algorithm>usingnamespacestd;intn,m,c,x,y;longlongans,a[1005][1005],s[1005][1005];intmain(){ scanf("%d%d%d",&n......
  • Laravel 设置表前缀
    Laravel是一个流行的PHP框架,被广泛地应用在Web应用程序的开发中。在Laravel中,我们可以非常方便地操作数据库,不仅支持多种类型的数据库,还提供了丰富的ORM实现,比如EloquentORM,使得我们可以非常高效地与数据库进行交互。在一些情况下,我们可能需要给Laravel的表添加一些......
  • Trie-前缀查询
    Tire专门为处理字符串设计的。平衡二叉树,查询复杂度是O(logn)但是100万个条目,2^20,logn大约20.但是Tire的复杂度,和字段中一共有多少条目无关!世间复杂度为O(w),w为查询单词的长度大多数的单词长度小于10图示整个字符串以字母为单位拆开cat、dog、deer、panda 可以看出每......
  • Python word'str'(字符串前缀string prefix)的种类
    Python字符串前缀(Stringprefix) r'string'r'',用法是不会对后方字符串中的转义符进行转义,如: str=r'\n'print(str)#会直接输出\n,并不会输出换行 f'string'f'',用法是对字符进行格式化就和str.format()一样,会对{}进行格式化,如: str=f'你好,{}'......
  • MySQL进阶篇:第四章_四.一_ 索引使用_最左前缀法则
    索引使用_最左前缀法则最左前缀法则如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将会部分失效(后面的字段索引失效)。以tb_user表为例,我们先来查看一下之前tb_user表所创建的索引。在......
  • Conveyor (CF E) (dp 差分/前缀 条件迷惑t)
     思路: 找各种性质1每一秒只有史莱姆进入起始点,然后他会选一个方向走(右或者下),每一秒史莱姆都会这样走在考虑前t秒内有S个史莱姆到达这个点,然后就会有s+1/2个往右走,s/2往下走而且问t秒只会有t-n-m-1秒后的时刻影响(诈骗t)于是利用dp+差......
  • 高维前缀和 (SOSDP)
    介绍一维前缀和:$s[i]=s[i-1]+a[i]$二维前缀和:$s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]$当然也可以这么写:for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)a[i][j]+=a[i-1][j];for(inti=1;i<=n;i++)for......
  • 关于前缀和
    Part1前缀和定义前缀和可以简单理解为"数列的前n项的和"它是一种重要的预处理方式,能大大降低查询的时间复杂度一般来讲,我们会预处理一个数组。对数组中每个元素,我们记录从起始到该元素对应下标/状态所有数字的总和一维前缀和给定一个长度为\(n\)的数组\(a\),预......