2015轻院校赛 矩阵

---恢复内容开始---

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

---恢复内容结束---

原文地址:https://www.cnblogs.com/linliu/p/5392680.html