题意:给出一个S * S的矩阵,每个位置可以放手机,初始时每个位置的都是空的。现要执行一些操作:1 X Y A,在位置(X, Y)增加A台手机,2 L B R T,查询(L, B)到(R, T)的矩阵的手机有多少(0 <= X, Y < S, 1 <= S <= 1024, -32768 <= A <= 32767, 手机总和最多只有2^30台)。
题目链接:http://poj.org/problem?id=1195
——>>二维树状数组模板题。。。设c[x][y]表示[x - lowerbit(x) + 1, x], [y - lowerbit(y) + 1, y]的所有点的手机总台数。于是……#^_^
#include <cstdio> #include <cstring> using namespace std; const int maxs = 1024 + 10; int S; int c[maxs][maxs]; int lowerbit(int x) { return x & (-x); } void add(int x, int y, int v) { for(int i = x; i <= S; i += lowerbit(i)) for(int j = y; j <= S; j += lowerbit(j)) c[i][j] += v; } int sum(int x, int y) { int ret = 0; for(int i = x; i > 0; i -= lowerbit(i)) for(int j = y; j > 0; j -= lowerbit(j)) ret += c[i][j]; return ret; } int main() { int instraction, X, Y, A, L, B, R, T; while(scanf("%d", &instraction) == 1) { switch(instraction) { case 0: { scanf("%d", &S); S++; memset(c, 0, sizeof(c)); break; } case 1: { scanf("%d%d%d", &X, &Y, &A); add(X+1, Y+1, A); break; } case 2: { scanf("%d%d%d%d", &L, &B, &R, &T); L++; B++; R++; T++; printf("%d\n", sum(R, T) - sum(R, B-1) - sum(L-1, T) + sum(L-1, B-1)); break; } default: break; } } return 0; }