二维树状数组 BZOJ 1452 [JSOI2009]Count
裸二维树状数组
#include <bits/stdc++.h> const int N = 305; struct BIT_2D { int c[105][N][N], n, m; void init(int n, int m) { memset (c, 0, sizeof (c)); this->n = n; this->m = m; } void updata(int k, int x, int y, int z) { for (int i=x; i<=n; i+=i&(-i)) { for (int j=y; j<=m; j+=j&(-j)) { c[k][i][j] += z; } } } int query(int k, int x, int y) { int ret = 0; for (int i=x; i; i-=i&(-i)) { for (int j=y; j; j-=j&(-j)) { ret += c[k][i][j]; } } return ret; } int count(int x1, int x2, int y1, int y2, int a) { return query (a, x2, y2) - query (a, x2, y1-1) - query (a, x1-1, y2) + query (a, x1-1, y1-1); } }; int a[N][N]; BIT_2D bit; int read() { int ret = 0, f = 1; char ch = getchar (); while (ch < '0' || ch > '9') { if (ch == '-') { f = -1; } ch = getchar (); } while (ch >= '0' && ch <= '9') { ret = ret * 10 + ch - '0'; ch = getchar (); } return ret * f; } int main() { int n, m; while (scanf ("%d%d", &n, &m) == 2) { bit.init (n, m); for (int i=1; i<=n; ++i) { for (int j=1; j<=m; ++j) { //scanf ("%d", &a[i][j]); a[i][j] = read (); bit.updata (a[i][j], i, j, 1); } } int q; scanf ("%d", &q); while (q--) { int op, x1, x2, y1, y2, x; scanf ("%d", &op); if (op == 1) { //scanf ("%d%d%d", &x1, &y1, &x); x1 = read (); y1 = read (); x = read (); bit.updata (a[x1][y1], x1, y1, -1); a[x1][y1] = x; bit.updata (a[x1][y1], x1, y1, 1); } else { //scanf ("%d%d%d%d%d", &x1, &x2, &y1, &y2, &x); x1 = read (); x2 = read (); y1 = read (); y2 = read (); x = read (); printf ("%d\n", bit.count (x1, x2, y1, y2, x)); } } } return 0; }
编译人生,运行世界!