HDU 1892 See you~ (二维树状数组)
题目链接: 戳我
题目大意:
给你一个书架, 1000*1000的矩阵,即格子.每个格子初始化都是1, 有下面几种操作:
S x1 y1 x2 y2 意思是你应该告诉我 以(X1,Y1),(X2,Y2)作为对角线,包括两点的矩形的总共有多少书。坑点: (x1, y1) 这个点不一定比 (x2, y2)这个点的小
A x1 y1 n1 意思是在(x1, y1) 这个位置放 n1 本书
D x1 y1 n1 意思是在 位置(X1,Y1)拿走 n1 本书,如果在那个位置上的书低于n1,则搬开所有的书。 反正不能出现负数
M x1 y1 x2 y2 n1 把(x1, y1)这个位置的 n1 本书 移动到 (x2, y2) 这个位置. 如果在那个位置上的书低于n1,则移走所有的书
注意: 0<=x1,y1,x2,y2<=1000,1<=n1<=100.
简单的二维树状数组.
//Author LJH //www.cnblogs.com/tenlee #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #define clc(a, b) memset(a, b, sizeof(a)) using namespace std; const int inf = 0x3f; const int INF = 0x3f3f3f3f; const int maxn = 1e3+5; int a[maxn][maxn]; int lowbit(int x) { return x & -x; } void Add(int x, int y, int val) { int yy = y; while(x < maxn) { yy = y; while(yy < maxn) { a[x][yy] += val; yy += lowbit(yy); } x += lowbit(x); } } int Sum(int x, int y) { int yy = y, ans = 0; while(x) { yy = y; while(yy) { ans += a[x][yy]; yy -= lowbit(yy); } x -= lowbit(x); } return ans; } void Init() { clc(a, 0); for(int i = 1; i < maxn; i++) { for(int j = 1; j < maxn; j++) { Add(i, j, 1); } } } int main() { int T, q, x1, y1, x2, y2, n1, sum; char op; scanf("%d", &T); for(int t = 1; t <= T; t++) { scanf("%d", &q); Init(); printf("Case %d:\n", t); while(q--) { scanf(" %c", &op); if(op == 'S') { scanf("%d %d %d %d", &x1, &y1, &x2, &y2); x1++, y1++, x2++, y2++; int a1, b1, a2, b2; a1 = min(x1,x2); a2 = max(x1,x2); b1 = min(y1,y2); b2 = max(y1,y2); printf("%d\n",Sum(a2,b2) - Sum(a1-1,b2) - Sum(a2,b1-1) + Sum(a1-1,b1-1)); } else if ( op == 'A' ) { scanf("%d %d %d", &x1, &y1, &n1); Add(x1+1, y1+1, n1); } else if( op == 'D' ) { int temp; scanf("%d %d %d", &x1, &y1, &n1); x1++, y1++; temp = Sum(x1,y1) - Sum(x1-1,y1) - Sum(x1,y1-1) + Sum(x1-1,y1-1); if(temp >= n1) Add(x1, y1, -n1); else Add(x1, y1, -temp); } else if(op == 'M') { scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &n1); x1++, y1++, x2++, y2++; int temp = Sum(x1,y1) - Sum(x1-1,y1) - Sum(x1,y1-1) + Sum(x1-1,y1-1); if(temp >= n1) { Add(x1, y1, -n1); Add(x2, y2, n1); } else { Add(x1, y1, -temp); Add(x2, y2, temp); } } } } return 0; }
www.cnblogs.com/tenlee