摘要:前缀和算是一种优化的方法,通过对数组中的元素进行预处理支持快速的区间求和查询,来降低时间复杂度的方法,不能算是一种算法,在信奥中应用很很广泛。
前缀和算是一种优化的方法,通过对数组中的元素进行预处理支持快速的区间求和查询,来降低时间复杂度的方法,不能算是一种算法,在信奥中应用很很广泛。
定义:将数组中的每个元素正常进行存储,然后新开一个数组用于存储当前索引前的所有元素和。在区间求和之类的问题非常好用,否则多次求区间和用枚举的方法很有可能超时。
例如:
正常的原数组 arr[6]={0,3,1,9,4,6};
前缀和数组 sum[6]={0,3,4,13,17,23};
求区间和 [left,right]的和为sum[right]-sum[left-1],例如区间[2,4]求和等于sum[4]-sum[1];
时间复杂度:构造前缀和数组的时间复杂度为O(n),查询为O(1)。
空间复杂度:因为需要额外开一个与原数组等长的数组,所有空间复杂度为O(n)。
优势:高效查询,将原本复杂度更高的查询优化到常数级别。通过预处理减少重复计算。前缀和简单理解,实现也简单直观易懂。
使用注意事项:查询的时候注意边界条件的处理;处于大数值的数组要考虑到溢出问题,通常sum数组开long long能解决。
例题:
给定一个包含n个整数的数组,你的任务是处理q个查询,每个查询的形式为:求范围[a,b] 内数值的和是多少?输入第一行输入两个整数 n和q数值的数量和查询的数量。第二行第二行输入n个整数x1,x2,…,xn:数组的数值。有q行描述查询。每行有两个整数a和b:求范围 [a,b] 内数值的和是多少?输出输出每个查询的结果。约束条件:1≤n,q≤2⋅10^5,1≤xi≤10^9,1≤a≤b≤ninput样例8 4 3 2 4 5 1 1 5 32 45 61 83 3output样例112244#include using namespace std;const int N=2e510;int n,q,a,b,x;long long sum[N];int main{ cin>>n>>q; //构造前缀和数组 for(int i=1;i>x,sum[i]=sum[i-1]+x; for(int i=1;i>a>>b; //区间 cout应用:
前缀和通常用于解决区间快死求和;在动态规划中利用前缀和来简化状态转移方程;计算图像的像素总和。
前缀和的基本框架:
int sum[N]={0};for(int i=1;i来源:梦琪教育
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!