题解 P4054 【[JSOI2009]计数问题】
本蒟蒻第四篇题解,上次提交写得太少了,这次望管理给过!
貌似是个树状数组模板题
写在前面
- 就没有其他改动了
CODE
#include <stdio.h>
int n, m;
int a[301][301];
int c[301][301][101];
inline void add(int x, int y, int k, int color) {
for (int i = x; i <= n; i += i & -i)
for (int j = y; j <= m; j += j & -j)
c[i][j][color] += k;
}
inline int query(int x, int y, int color) {
int ret = 0;
for (int i = x; i; i -= i & -i)
for (int j = y; j; j -= j & -j)
ret += c[i][j][color];
return ret;
}
int main(void) {
scanf("%d %d", &n, &m);
int Q, x1, y1, x2, y2, color;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j) {
scanf("%d", &color);
a[i][j] = color;
add(i, j, 1, color);
}
for (scanf("%d", &Q); Q--; ) {
int op;
scanf("%d", &op);
if (op == 1) {
scanf("%d %d %d", &x1, &y1, &color);
add(x1, y1, -1, a[x1][y1]);
a[x1][y1] = color;
add(x1, y1, 1, color);
}
else {
scanf("%d %d %d %d %d", &x1, &x2, &y1, &y2, &color);
printf("%d\n", query(x2, y2, color) - query(x1 - 1, y2, color) - query(x2, y1 - 1, color) + query(x1 - 1, y1 - 1, color));
}
}
return 0;
}
推荐树状数组题单
官方精选
- 【数据结构2-2】线段树与树状数组
用户分享
-
树状数组模板题
-
CMの树状数组
The end. Thanks.
(走过路过一定要赞过啊