1. 程式人生 > 實用技巧 >字首和進階(今天有點高產)

字首和進階(今天有點高產)

當前綴和進階到二維陣列時,就需要進行一些想象,假設有個矩陣,水平方向向右時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行,每行輸出一個詢問的結果。

資料範圍

1n,m1000
1q200000
1x1x2n,
1y1y2m
10001000

輸入樣例:

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]);
}
}

結束結束結束!!!!