您的位置:首页 > 其它

zoj 计算子矩阵的平方和

2013-06-04 17:06 120 查看
做这个题目有点技巧,要算一个矩阵内元素的平方,然后相加,一般的做法超时,此时我们先把一小块一小块的矩阵的平方和算好,保存下来,然后直接求和就好了

H - Evaluate Matrix Sum
Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld
& %llu
Submit Status Practice ZOJ
1636

Description

Given a matrix, the elements of which are all integer number from 0 to 50, you are required to evaluate the square sum of its specified sub-matrix.


Input

The first line of the input contains a single integer T (1 <= T <= 5), the number of test cases.
For each test case, the first line contains two integers m and n (1 <= m, n <= 500), which are the row and column sizes of the matrix, respectively. The next m lines with n numbers each gives the
elements of the matrix.
The next line contains a single integer N (1 <= N <= 100,000), the number of queries. The next N lines give one query on each line, with four integers r1, c1, r2, c2 (1 <= r1 <= r2 <= m, 1 <= c1
<= c2 <= n), which are the indices of the upper-left corner and lower-right corner of the sub-matrix in question.


Output

For each test case, first print the number of the test case, then N lines with one number on each line, the required square sum. Refer to the sample output for details.


Sample Input

2
2 3
1 2 3
4 5 6
2
1 1 2 2
1 3 2 3
3 3
4 2 3
2 5 1
7 9 2
1
1 1 3 3



Sample Output

Case 1:
46
45
Case 2:
193




计算和的过程需要技巧,就是每一次计算,保证都是成一个矩阵的,比如计算sum[2][1],第二行第一个,得到的不是a[1][1] + a[1][2] + a[1][3] + a[2][1], 而是

a[2][1] + a[1][1];

代码:

#include <string>
#include <cstring>
#include <stdio.h>
#include <math.h>
#include <iostream>

using namespace std;

int a[ 510 ][ 510 ];
int sum[ 510 ][ 510 ];
int main() {
int T,n,m,Q;
int tp;
int cas=1;
int r1,c1,r2,c2;
scanf("%d",&T);
while( T-- ) {
scanf("%d%d",&n,&m);
memset(sum,0,sizeof(sum) );
for(int i=1;i<=n;i++) {
tp = 0;
for(int j=1;j<=m;j++) {
scanf("%d",&a[i][j]);
tp += a[i][j] * a[i][j];
sum[i][j] = sum[ i - 1 ][ j ] + tp;
}
}
scanf("%d",&Q);
printf("Case %d:\n",cas++);
while( Q -- ) {
scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
printf("%d\n",sum[ r2 ][ c2 ] - sum[ r1-1 ][ c2 ] - ( sum[ r2 ][ c1 - 1 ] - sum[ r1 - 1 ][ c1 - 1 ] ) );
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: