首页 > 其他分享 >【模版】前缀和

【模版】前缀和

时间:2023-12-21 11:44:20浏览次数:25  
标签:前缀 int 模版 复杂度 cin MAXN 区间

问题引入:

【洛谷P8218】

## 题目描述

给定 $n$ 个正整数组成的数列 $a_1, a_2, \cdots, a_n$ 和 $m$ 个区间 $[l_i,r_i]$,分别求这 $m$ 个区间的区间和。

对于所有测试数据,$n,m\le10^5,a_i\le 10^4$

 

最朴素的想法,就是对于每次询问,我们都用for循环进行 $[l_i,r_i]$区间的求和,不难看出时间复杂度为O(n*m)。

而如果我们利用前缀和,便可以把时间复杂度优化成O(m+n)。

 

所以前缀和是一种预处理,用于降低查询时的时间复杂度。

 

(一维)前缀和的定义:

设si为数列a从第一个数到第i个数的和,当i>=1时,显然有s[i]=s[i-1]+a[i],这里s[i]数组记录的数值称为前缀和。

若要求出$[l_i,r_i]$区间的和,只需要求s[r]-s[l-1],单次时间复杂度为O(1)

 

本题AC代码如下:

#include<iostream>
using namespace std;
#define MAXN 100010;
int n,m;
int a[MAXN],s[MAXN];

int main() {
    cin >> n;
    for (int i=1;i<=n;i++) {
        cin >> a[i];   //若要使用前缀和,数组最好从下标1开始
        s[i]=s[i-1]+a[i];
    }
    cin >> m;
    for (int i=1,l,r;i<=m;i++) {
        cin >> l >> r;
        cout << s[r]-s[l-1];
    }
    return 0
}

 

二维前缀和待补,累了

标签:前缀,int,模版,复杂度,cin,MAXN,区间
From: https://www.cnblogs.com/Yukie/p/17918660.html

相关文章

  • P5091 【模版】扩展欧拉定理
    求\(a^b\bmodm,b\le10^{200000}\)。首先引入三种可以通过取模缩小幂指数的方法。费马小定理:当\(a,p\in\mathbb{Z},\spacep\)为质数且\(p\nmida\)时,\(a^{p-1}\equiv1(\bmod\spacep)\),所以有\(a^b\equiva^{b\bmod(p-1)}(\bmod\spacep)\);欧拉定理:当\(a,m\in\m......
  • 【模版】冒泡排序
    刚学C++时书上就会写这个qwq属于最简单的排序算法惹。算法步骤比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对......
  • 【模版】选择排序
    选择排序(Selectionsort)是一种简单直观的排序算法。1.基本思想首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的思想其实和冒泡排序有点类似,都......
  • 【模版】计数排序
    引入:P1271【深基9.例1】选举学生会在实际中,一般会在投票区放n个投票箱,投完后只需要计数每个投票箱即可。就此可引入计数排序。本题AC代码(虽然这题直接sort就行了...)#include<iostream>usingnamespacestd;inta[1010]={0},n,m,tmp;intmain(){cin>>n>>m;for......
  • 【模版】归并排序
    归并排序,它有两大核心操作.一个是将数组一分为二,一个无序的数组成为两个数组。另外一个操作就是,合二为一,将两个有序数组合并成为一个有序数组。时间复杂度情况:最好和最快情况都是:O(NlogN)代码模版如下intarr[N],temp[N];voidmerge_sort(intarr[],intl,intr......
  • 【模版】快速排序
    快速排序基本思想通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。算法复杂度最差时间复杂度O(N2)平均时间复杂度O(Nl......
  • 莫比乌斯函数平方前缀和
    考虑求\(\sum_{i=1}^n\mu(i)^2\)结论是\(\mu(i)^2=\sum_{j^2|i}\mu(j)\)考虑证明这个式子。先证明若\(\mu(i)\neq0\)此时\(\mu(i)^2=1\)显然只有\(j=1\)在右式造成贡献\(1\)等式成立。若存在\(j\neq1\)也在右式造成贡献,那么显然\(i\)有次数\(\ge2\)质因子了\(\mu(i)=0\)与......
  • 【算法模版】二分查找
    1.简介故事分享......
  • 枚举子集&高维前缀和学习笔记
    枚举子集首先\(n\)位二进制数可以表示一个大小为\(n\)的集合的所有子集。接下来的问题均用二进制数展开。一种暴力的想法是枚举所有数然后判一下是否满足条件,单次时间复杂度\(O(2^n)\),对所有数做一遍就是\(O(4^n)\)。发现有很多枚举是无用的,考虑怎么样让每次枚举出来的都......
  • 前缀和,差分,二叉堆
    目录前缀和一维数组前缀和二维数组前缀和差分二叉堆前缀和一维数组前缀和代码如下:for(inti=0;i<n;i++){if(i==0)y[i]=x[i];elsey[i]=y[i-1]+x[i];}或者for(inti=1;i<=n;i++){y[i]=y[i-1]+x[i];}二维数组前缀和代码如下:for(inti=1;i<=n;i++){f......