子矩阵的和 刷题笔记 {二维前缀和}

首先我们的目标是让 s[i][j]表示为其左方和上方形成的矩阵所有元素的和

加上s[i-1][j]和s[i][j-1]后 s[i-1][j-1]部分重复了所以减去

最后加上a[i][j]即可完成目标

s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];

然后看题目要求

要求x1,y1,x2,y2围成的小正方形内的元素和

我们利用刚刚处理好的s[i][j]来操作

将是s[x2][y2]圈成的大正方形里面扣掉这两块

即s[x2][y1-1]和s[x1-1][y2]

最后加回去重复减去的s[x1-1][y1-1]即可

所以式子为 s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];

代码

#include<iostream>

#include<cstring>

#include<cstdio>

#include<algorithm>

using namespace std;

const int N=1010;

int a[N][N],s[N][N];

int n,m,q;

int main(){

cin>>n>>m>>q;

for(int i=1;i<=n;i++)

{

for(int j=1;j<=m;j++)

{

cin>>a[i][j];

s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];

}

}

while(q--){

int x1,y1,x2,y2;

cin>>x1>>y1>>x2>>y2;

cout<<s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];

}

return 0;

}

相关推荐
润 下10 分钟前
C语言——深入解析C语言指针:从基础到实践从入门到精通(二)
c语言·开发语言·经验分享·笔记·学习·程序人生
特种加菲猫1 小时前
网络协议分层:解密TCP/IP五层模型
linux·网络·笔记
小秋学嵌入式-不读研版1 小时前
C65-枚举类型
c语言·开发语言·笔记
三三木木七1 小时前
AI超级智能体学习笔记
笔记·学习
长桥夜波1 小时前
【第十七周】机器学习笔记06
人工智能·笔记·机器学习
一只小风华~2 小时前
Vue Router 的三种历史模式详解
前端·javascript·vue.js·笔记·学习·前端框架·ecmascript
一只小风华~2 小时前
Vue Router 导航守卫
java·前端·javascript·vue.js·笔记·html
东方芷兰2 小时前
LLM 笔记 —— 07 Tokenizers(BPE、WordPeice、SentencePiece、Unigram)
人工智能·笔记·深度学习·神经网络·语言模型·自然语言处理·nlp
不会kao代码的小王2 小时前
从本地到云端:Fiora+cpolar打造真正的私密社交通讯站
笔记
fanstering3 小时前
深度相机初探:立体视觉(Stereo Vision)、结构光(Structured Light)、TOF(Time of Flight,飞行时间)
笔记·数码相机·立体视觉·结构光·tof