一维和二维前缀和模板
程序员文章站
2022-03-21 17:41:32
...
在这里插入代码
#一维前缀和
1、首先建立a[N]和s[N]//s[N]是前缀和数组
2、预处理前缀和数组,使得s[i]=s[i-1]+a[i];
3、求[l,r]范围的前缀和,就是s[r]-s[l-1]
4、最重要的是数组从1开始,为了方便处理
##模板
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=100010;
int a[N],s[N];
int main()
{
int n,m;
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
while(m--)
{
int l,r;
cin>>l>>r;
cout<<s[r]-s[l-1]<<endl;
}
}
#二维前缀和
1、s[i][j]怎么求?
公式s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
2、那么怎么求子矩阵的和呢?
就是s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][x2-1]
##模板
#include<iostream>
using namespace std;
const int N=1010;
int a[N][N],s[N][N];
int main()
{
int n,m,q;
ios::sync_with_stdio(false);
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
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];
while(q--)
{
int x1,x2,y1,y2;
cin>>x1>>y1>>x2>>y2;
cout<<s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<<endl;
}
}
上一篇: 系统级性能分析工具perf的介绍与使用
下一篇: JS基础语法----Math对象
推荐阅读
-
Python numpy实现二维数组和一维数组拼接的方法
-
建议收藏备用:.net core使用QRCoder生成普通二维码和带Logo的二维码详细使用教程,源码已更新至开源模板
-
利用phpqrcode二维码生成类库和imagecopymerge函数制拼接图片的经验(一)
-
编写一个表示二维平面上的点的类MyPoint,满足以下条件: 1、定义private的成员变量x和y,表示点的x和y坐标,类型为double
-
vue-cli2打包前和打包后的css前缀不一致的问题解决
-
【C语言】一维数组和二维数组
-
如何生成一个安卓和苹果手机都能识别的二维码
-
彩色二维码生成器,带logo文字和中心文字 彩色二维码生成器,带logo文字和中心文字 使用.net 4.0和zxing开发, 内容支持中文,使用UTF-8编码,一般扫描二维码软件可以识别。 最上方显示文字log,字数可以调节。 正中间的圆圈内显示中心文字。 微盘下载地址:彩色二维码生成器.net2.0win7可用byKimmKing.zip
-
彩色二维码生成器,带logo文字和中心文字 彩色二维码生成器,带logo文字和中心文字 使用.net 4.0和zxing开发, 内容支持中文,使用UTF-8编码,一般扫描二维码软件可以识别。 最上方显示文字log,字数可以调节。 正中间的圆圈内显示中心文字。 微盘下载地址:彩色二维码生成器.net2.0win7可用byKimmKing.zip
-
P6143 [USACO20FEB]Equilateral Triangles P——几何+二维前缀和