ACM入门之前缀和

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM入门之前缀和相关的知识,希望对你有一定的参考价值。

前缀和在ACM中算是一个简单易学,且十分重要的一个算法。

前缀和的种类:

  • 一维前缀和
  • 二维前缀和
  • 高维前缀和(比较少见)
  • 树上前缀和

对于一维前缀和,它可以解决O(1)的时间复杂度来获取某一区间的和。
对于二维前缀和,它可以解决O(1)的时间复杂度来获取某一矩阵的和。

前缀和的弊端,即前缀和数组构造后不能再次的修改,否则还得再次构建,时间复杂度会大幅度的上升。

一维前缀和模板:

const int N=1e5+10;
int a[N],s[N],n;
void init()//构造前缀和 

	for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];

int query(int l,int r)//查询[l,r]的和 

	return s[r]-s[l-1];

一维前缀和相关习题:
U69096 前缀和的逆 代码地址
U53525 前缀和(例题) 代码地址
AT2412 最大の和 代码地址
P3131 [USACO16JAN]Subsequences Summing to Sevens S 代码地址

二维前缀和模板:

const int N=1e3+10;
int a[N][N],s[N][N],n,m;
void init()

	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++) 
		s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];

int query(int x,int y,int xx,int yy)//(x,y)矩阵的左上角的坐标,(xx,yy)矩阵右下角的坐标

	int sum=s[xx][yy]-s[x-1][yy]-s[xx][y-1]+s[x-1][y-1];
	return sum;

二维前缀和相关习题:
P1387 最大正方形 代码地址

以上是关于ACM入门之前缀和的主要内容,如果未能解决你的问题,请参考以下文章

ACM入门之搜索

ACM入门之二分

ACM入门之二分图

ACM入门之差分

ACM入门之树的重心

ACM入门之树状数组