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

}

 

 

你可能感兴趣的:(ACM)