(2015年郑州轻工业学院ACM校赛题) G 矩阵

看这道题的时候就感觉用一点动归思想+暴力 就能过了。

#include<stdio.h>
#include<iostream>
#include<stack>
#include<queue>
#include<math.h>
#include<stdlib.h>
#include<cstring>
using namespace std;
#define Max(a,b) (a>b?a:b)
#define Min(a,b) (a<b?a:b)
#define INF 0xfffffff
#define maxn 1100
 
struct Point
{
    int x, y, v;
}P[maxn];
 
int dp[maxn][maxn];
int n, m, k;
 
void Q()
{
    int i, ans;
    Point A, B;
    cin >> A.x >> A.y >> B.x >> B.y;
 
    ans = dp[B.x][B.y] + dp[A.x-1][A.y-1] - dp[A.x-1][B.y] - dp[B.x][A.y-1];
 
    for(i=0; i<k; i++)
    {
        if(P[i].x >= A.x && P[i].x <= B.x && P[i].y >= A.y && P[i].y <= B.y)
        {
            ans = ans - P[i].x - P[i].y + P[i].v;
        }
    }
    printf("%d\n", ans);
}
 
void M()
{
    cin >> P[k].x >> P[k].y >> P[k].v;
 
    for(int i=0; i<k; i++)
    {
        if(P[i].x == P[k].x && P[i].y == P[k].y)
        {
            P[i].v = P[k].v;
            return ;
        }
    }
    k ++;
}
 
int main()
{
 
    int T, i, j, t;
    char str[2];
 
    for(i=1; i<=1000; i++)
    {
        for(j=1; j<=1000; j++)
            dp[i][j] = i + j + dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1];
    }
 
    cin >> T;
 
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&t);
        k = 0;
        while(t--)
        {
            scanf("%s", str);
 
            if(str[0] == 'Q')
                Q();
            else
                M();
        }
    }
    return 0;
}
 

 

posted @ 2015-04-21 09:56  向前走丶不回首  阅读(281)  评论(0编辑  收藏  举报