根据条件求任意子矩阵
#include<stdio.h>
#include<string.h>
# define N 1100
int a[N][N];
typedef struct data
{
int x, y, da;
}DATA;
DATA d[30];
void Start()
{
int i, j;
for (i = 1; i < N; i++)
{
for (j = 1; j < N; j++)
a[i][j] = a[i-1][j] + a[i][j-1] + i + j - a[i-1][j-1];
}
} //把每一个从(1,1)开始的矩阵的元素和记录下来
int main ()
{
Start();
int T, n, m, k, K, i, p, q, r, s, sum, flag;
char ch;
scanf("%d", &T);
while (T--)
{
K = 0;
scanf("%d %d %d", &n, &m, &k);
while (k--)
{
flag = 1;
sum = 0;
scanf(" %c %d %d %d", &ch, &p, &q, &r);
if (ch == 'Q')
{
scanf("%d", &s);
sum = a[r][s] - a[p-1][s] - a[r][q-1] + a[p-1][q-1]; //现将未改动的矩阵和求出
for (i = 0; i < K; i++)
{
if (d[i].x >= p && d[i].x <= r && d[i].y >= q && d[i].y <= s) //查询该子矩阵中元素是否有改动
{
sum -= d[i].x;
sum -= d[i].y;
sum += d[i].da;
} //若有改动则改变sum的值
}
printf("%d
", sum);
}
else if (ch == 'M')
{
for (i = 0; i < K; i++)
{
if (d[i].x == p && d[i].y == q)
{
flag = 0;
break;
} //查询结构体中已有的元素中是否有此次输入的数据
}
if (flag == 1)
{
d[K].x = p;
d[K].y = q;
d[K].da = r;
K++;
} //如果没有就将该数据加入结构体
else
{
d[i].x = p;
d[i].y = q;
d[i].da = r;
} //如果有就将结构体相同位置的元素改成此次输入的数据
}
}
}
return 0;
}