C++信奥之径,锻炼思维,扎实算法-前缀和

B站影视 2025-01-01 17:49 2

摘要:前缀和算是一种优化的方法,通过对数组中的元素进行预处理支持快速的区间求和查询,来降低时间复杂度的方法,不能算是一种算法,在信奥中应用很很广泛。

前缀和算是一种优化的方法,通过对数组中的元素进行预处理支持快速的区间求和查询,来降低时间复杂度的方法,不能算是一种算法,在信奥中应用很很广泛。

定义:将数组中的每个元素正常进行存储,然后新开一个数组用于存储当前索引前的所有元素和。在区间求和之类的问题非常好用,否则多次求区间和用枚举的方法很有可能超时。

例如:

正常的原数组 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

来源:梦琪教育

相关推荐