---恢复内容开始---
http://acm.zznu.edu.cn/problem.php?id=1967
题目大意 : 矩阵A [i][j]=i+j;
Q代表查询 求任意一个矩阵的和
M代表更换 把原来的换成现在这个数
分析: 如果暴搜肯定不行 就想到一种好方法 把他们的和保存到一个数组 事先打好一个表 后面更新的点一一的记录下来
求和的时候就只需把在这个求得小长方形里的更新的值加到一起 最后在加上原来矩阵的和就可以
#include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <cstdio> #include <cstdlib> #include <cctype> #include <cmath> using namespace std; #define memset(a,b) memset(a,b,sizeof(a)) #define N 1100 struct node { int x,y,c; }a[N]; int sum[N][N]; void Inn() { for(int i=1;i<=N;i++) { for(int j=1;j<=N;j++) { sum[i][j]=sum[i-1][j]+sum[i][j-1]+i+j-sum[i-1][j-1]; } } } int main() { int T,n,m,Q; char str[5]; scanf("%d",&T); Inn(); while(T--) { scanf("%d %d %d",&n,&m,&Q); int k=0; while(Q--) { int x1,x2,y1,y2,h; scanf("%s",str); if(str[0]=='Q') { int ans=0; scanf("%d %d %d %d",&x1,&y1,&x2,&y2); for(int i=0;i<k;i++) { if(a[i].x>=x1 && a[i].x<=x2 && a[i].y>=y1 && a[i].y<=y2) { ans=ans+a[i].c-(a[i].x+a[i].y); } } ans=ans+sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]; printf("%d ",ans); } else { int f=0; scanf("%d %d %d",&x1,&y1,&h); for(int i=0;i<k;i++) { if(x1==a[i].x && y1==a[i].y) { a[i].c=h; f=1; break; } } if(f==0) a[k].x=x1, a[k].y=y1, a[k++].c=h; } } } return 0; }
---恢复内容结束---