看这道题的时候就感觉用一点动归思想+暴力 就能过了。
#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 ", 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; }