首页 > 其他分享 >前缀和

前缀和

时间:2024-06-20 22:44:07浏览次数:9  
标签:前缀 int text cin MAXN using

前缀和

前缀和是什么

可以说,前缀和是一种优化程序运行时间的一种方法,一般用于求一个序列中的区间和

前缀和的原理

顾名思义,前缀和数组,即一个序列中前 \(i\) 个数据之和。

\[b_i = \sum_{j = 0}^{i} a_j \]

所以 \(a_l\) 到 \(a_r\) 的和是:

\[\sum_{j = l}^{r} a_j = b_r - b_{l - 1} \]

难么该如何将求前缀和的时间复杂度降到 \(O(n)\) 呢?

\[b_i = b_{i-1} + a_i \text{ (这里的 } i \text{ 是下标从 } 1 \text{ 开始的数)} \]

题目

例题 1 (P8218 求区间和

输入 / 输出:

# input
5
1 2 3 4 5
4
1 2
1 5
2 3
3 5
# Output
1 3 6 10 15
3
15
5
12

本题是前缀和模板,不做解释。

Code

#include <iostream>
using namespace std;
#define MAXN 100005
int a[MAXN],b[MAXN];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=b[i-1]+a[i];
	}
	for(int i=1;i<=n;i++) cout<<b[i]<<" ";//输出前缀和数组
	cout<<endl;
	int q;
	cin>>q;
	while(q--){//询问 q 次
		int l,r;
		cin>>l>>r;
		cout<<b[r]-b[l-1]<<endl;
	}
	return 0;
}

练习 1(P10233 dx 分计算

练习 2(P1115 最大子段和

各题代码

Code - 练习 1

#include <iostream>
using namespace std;
#define MAXN 10000005
int b[MAXN];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		string s;
		cin>>s;
		if(s[0]=='P') b[0]=3;
		if(s[0]=='p') b[0]=2;
		if(s[0]=='G') b[0]=1;
		if(s[0]=='g'||s[0]=='m') b[0]=0;
		for(int i=1;i<s.size();i++)
		{
			if(s[i]=='P') b[i]=3+b[i-1];
			if(s[i]=='p') b[i]=2+b[i-1];
			if(s[i]=='G') b[i]=1+b[i-1];
			if(s[i]=='g'||s[i]=='m') b[i]=b[i-1];
		}
		int q;
		cin>>q;
		while(q--)
		{
			int l,r;
			cin>>l>>r;
			if(l==1) cout<<b[r-1]<<endl;
			else cout<<b[r-1]-b[l-2]<<endl;
		}
	}
	return 0;
}

Code - 练习 2

#include <iostream>
using namespace std;
#define MAXN 200005
int f[MAXN];
int main()
{
	int n;
	cin>>n;
	int x;
	cin>>x;
	f[0]=x;
	for(int i=1;i<n;i++)
	{
		int temp;
		cin>>temp;
		f[i]=max(f[i-1]+temp,temp);
	}
	int maxans=-1e9;
	for(int i=0;i<n;i++)
	{
		maxans=max(maxans,f[i]);
	}
	cout<<maxans;
	return 0;
}

标签:前缀,int,text,cin,MAXN,using
From: https://www.cnblogs.com/zhangyuyi1218/p/18259611/PreSum

相关文章

  • 【数据结构】前缀树(字典树)汇总
    基础{“a”,“abc”,“bac”,“bbc”,“ca”}的字典树如下图:最主用的应用:一,字符串编码。二,位运算。字符串编码相比利用哈希映射编码,优点如下:依次查询长度为n的字符串s的前缀时间复杂度是O(n)。查询完s[0…i],再查询s[0…i+1]的时间复杂度是O(1)。而哈希映射的时间复杂......
  • 树上前缀和与差分
    树上前缀和设\(sum_i\)表示根节点到节点\(i\)的权值总和。则有:对于点权,\(x,y\)路径上的和为\(sum_x+sum_y-sum_{lca}-sum_{fa_{lca}}\)。对于边权,\(x,y\)路径上的和为\(sum_x+sum_y-2\timessum_{lca}\)。习题:P4427[BJOI2018]求和解题思路预处理出......
  • 程序分享--常见算法/编程面试题:最长公共前缀
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容,持续上传中。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满......
  • 【一百零九】【算法分析与设计】树状数组求解前缀最大值,673. 最长递增子序列的个数,
    树状数组求解前缀最大值树状数组可以求解和前缀区间有关的问题,例如前缀和,前缀区间最值.可以利用logn......
  • 2559. 统计范围内的元音字符串数(前缀和) o(n)时间复杂度
    给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries 。每个查询 queries[i]=[li,ri] 会要求我们统计在 words 中下标在 li 到 ri 范围内(包含 这两个值)并且以元音开头和结尾的字符串的数目。返回一个整数数组,其中数组的第 i 个元素对......
  • 组合数前缀和计算
    记录一下,下文的除法非特殊注明都是向下取整。求\(F(n,k)=\sum_{i=0}^{k}\binom{n}{i}\pmodp\)。首先使用卢卡斯定理。\[\begin{aligned}&\sum_{i=0}^{k}\binom{n}{i}\\=&\sum_{i=0}^{k}\binom{\frac{n}{p}}{\frac{i}{p}}\binom{n\bmodp}{i\bmodp}\\=&\s......
  • 求前缀表达式的值
    1.题目7-7求前缀表达式的值分数25全屏浏览切换布局作者 DS课程组单位 浙江大学算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:++2*3-74/84。请设计程序计算前缀表达式......
  • 前缀和解决字符串变化问题
    题目小苯有一个长度为\(n\)的字符串\(s\),每次操作他可以选择一个位置的字母将其的大小写反转,也就是说如果字符是小写,则操作后会变成大写,如果字符是大写则反之。他现在希望将\(s\)变为:“前面若干字符是大写,后面的字符全是小写”的样子,例如:"AABBccdd"。(注意:全大写和全小写均不合法......
  • LeetCode 第14题:最长公共前缀题目解析(进阶版)
    本文我们来探索LeetCode第14题——最长公共前缀题目解析(进阶版)。文章目录引言题目介绍解题思路思路1:水平扫描法思路2:垂直扫描法思路3:分治法思路4:二分查找法思路5:字典树(Trie)水平扫描法详细解析步骤1:初始化前缀步骤2:逐个比较示例讲解Java代码实现图......
  • 统计子矩阵+二维前缀和+滑动窗口
    题目链接:0统计子矩阵-蓝桥云课(lanqiao.cn)代码#include<iostream>usingnamespacestd;constintN=505;intnum[N][N];intmain(){ intn,m,k; cin>>n>>m>>k; intcount=0; for(inti=1;i<=n;i++){ for(intj=1;j......