1、http://www.spoj.com/problems/MATSUM/
2、题目大意:
给一个n*n的矩阵,对这个矩阵有三种操作,一是SET x y num将(x,y)位置的数改成num,
二是SUM x1 y1 x2 y2,求(x1,y1)到(x2,y2)这一矩形内的数字和,并将其输出
题目中说是每组样例输出一个换行,但是输出就不正确了,纠结。。。
3、题目:
A N × N matrix is filled with numbers. BuggyD is analyzing the matrix, and he wants the sum of certain submatrices every now and then, so he wants a system where he can get his results from a query. Also, the matrix is dynamic, and the value of any cell can be changed with a command in such a system.
Assume that initially, all the cells of the matrix are filled with 0. Design such a system for BuggyD. Read the input format for further details.
The first line of the input contains an integer t, the number of test cases. t test cases follow.
The first line of each test case contains a single integer N (1 <= N <= 1024), denoting the size of the matrix.
A list of commands follows, which will be in one of the following three formats (quotes are for clarity):
For each test case, output one line for the answer to each "SUM" command. Print a blank line after each test case.
Input: 1 4 SET 0 0 1 SUM 0 0 3 3 SET 2 2 12 SUM 2 2 2 2 SUM 2 2 3 3 SUM 0 0 2 2 END Output: 1 12 12 134、AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 1030 int n; int c[N][N]; int b[N][N]; int lowbit(int i) { return i&(-i); } void update(int x,int y,int v) { for(int i=x;i<=n;i+=lowbit(i)) { for(int j=y;j<=n;j+=lowbit(j)) { c[i][j]+=v; } } } int getsum(int x,int y) { int sum=0; for(int i=x;i>0;i-=lowbit(i)) { for(int j=y;j>0;j-=lowbit(j)) { // printf("c=%d %d %d\n",i,j,c[i][j]); sum+=c[i][j]; } } return sum; } int main() { int t,x,y,v,x1,y1,x2,y2; char s[10]; scanf("%d",&t); while(t--) { memset(c,0,sizeof(c)); memset(b,0,sizeof(b)); scanf("%d",&n); while(scanf("%s",s)) { if(strcmp(s,"END")==0) break; if(strcmp(s,"SET")==0) { scanf("%d%d%d",&x,&y,&v); x++; y++; int tmp=v-b[x][y]; //printf("*%d %d %d\n",x,y,v); update(x,y,tmp); b[x][y]=v; } else if(strcmp(s,"SUM")==0) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); x1++; y1++; x2++; y2++; //printf("&%d %d %d %d\n",x1,y1,x2,y2); //printf("getsum(x2,y2)=%d\n",getsum(x2,y2)); //printf("sum=%d %d %d %d\n",getsum(x2,y2),getsum(x2,y1-1),getsum(x1-1,y2),getsum(x1-1,y1-1)); int ans=getsum(x2,y2)-getsum(x2,y1-1)-getsum(x1-1,y2)+getsum(x1-1,y1-1); printf("%d\n",ans); } } // printf("\n"); } return 0; } /* 3 4 SET 0 0 1 SUM 0 0 3 3 SET 2 2 12 SUM 2 2 2 2 SUM 2 2 3 3 SUM 0 0 2 2 END 4 SET 0 0 3 SUM 0 0 3 3 SET 2 2 12 SUM 2 2 2 2 SUM 2 2 3 3 SUM 0 0 2 2 END 4 SET 0 0 1 SUM 0 0 3 3 SET 2 2 12 SUM 2 2 2 2 SUM 2 2 3 3 SUM 0 0 2 2 END */