字首和進階(今天有點高產)
當前綴和進階到二維陣列時,就需要進行一些想象,假設有個矩陣,水平方向向右時x軸的正方向,豎直方向向下是y軸正方向,如此若要表示以下x1,y1和x2,y2(預設x2,y2分別大於x1,y1)兩個點間的數字之和,則可以先將原點到x2,y2的數字之和減去原點到x1-1,x2的數字之和再減去原點到x2,y1-1的數字之和,最後加上減去的重複區域的數字之和即原點到x1-1,y1-1的數字之和,便可以求得這兩個點間的數字之和。
具體題目:
輸入一個n行m列的整數矩陣,再輸入q個詢問,每個詢問包含四個整數x1, y1, x2, y2,表示一個子矩陣的左上角座標和右下角座標。
對於每個詢問輸出子矩陣中所有數的和。
輸入格式
第一行包含三個整數n,m,q。
接下來n行,每行包含m個整數,表示整數矩陣。
接下來q行,每行包含四個整數x1, y1, x2, y2,表示一組詢問。
輸出格式
共q行,每行輸出一個詢問的結果。
資料範圍
1≤n,m≤1000
1≤q≤200000
1≤x1≤x2≤n,
1≤y1≤y2≤m
−1000≤矩陣內元素的值≤1000
輸入樣例:
3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4
輸出樣例:
17
27
21
AC程式碼:
#include <bits/stdc++.h>
using namespace std;
int a[1010][1010];
int s[1010][1010];
int main()
{
int n,m,q;
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,x2,y1,y2;
cin>>x1>>y1>>x2>>y2;
printf("%d\n",s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]);
}
}
結束結束結束!!!!