2 条题解
-
0
C93 二维树状数组 P4054 [JSOI2009] 计数问题
#include <bits/stdc++.h> using namespace std; #define lowb(x) x & -x const int N=301; int n, m; int a[N][N],s[N][N][105]; void change(int x, int y, int c, int k) { for (int i = x; i <= n; i += lowb(i)) for (int j = y; j <= m; j += lowb(j)) s[i][j][c] += k; } int query(int x, int y, int c) { int t = 0; for (int i = x; i; i -= lowb(i)) for (int j = y; j; j -= lowb(j)) t += s[i][j][c]; return t; } int main() { scanf("%d%d", &n, &m); for (int i = 1, c; i <= n; ++i) for (int j = 1; j <= m; ++j) { scanf("%d", &c); a[i][j] = c; change(i, j, c, 1); } int q;scanf("%d", &q); while (q--) { int op, x1, y1, x2, y2, c;scanf("%d", &op); if (op == 1) { scanf("%d%d%d", &x1, &y1, &c); change(x1, y1, a[x1][y1], -1); a[x1][y1] = c; change(x1, y1, c, 1); } else { scanf("%d%d%d%d%d", &x1, &x2, &y1, &y2, &c); int ans = query(x2, y2, c) - query(x1 - 1, y2, c) - query(x2, y1 - 1, c) + query(x1 - 1, y1 - 1, c); printf("%d\n", ans); } } } -
0
C93 二维树状数组 P4054 [JSOI2009] 计数问题
#include <bits/stdc++.h> using namespace std; #define lowb(x) x & -x const int N=301; int n, m; int a[N][N],s[N][N][105]; void change(int x, int y, int c, int k) { for (int i = x; i <= n; i += lowb(i)) for (int j = y; j <= m; j += lowb(j)) s[i][j][c] += k; } int query(int x, int y, int c) { int t = 0; for (int i = x; i; i -= lowb(i)) for (int j = y; j; j -= lowb(j)) t += s[i][j][c]; return t; } int main() { scanf("%d%d", &n, &m); for (int i = 1,c; i <= n; ++i) for (int j = 1; j <= m; ++j) { scanf("%d", &c); a[i][j] = c; change(i, j, c, 1); } int q;scanf("%d", &q); while (q--) { int op,x1,y1,x2,y2,c;scanf("%d", &op); if (op == 1) { scanf("%d%d%d", &x1, &y1, &c); change(x1, y1, a[x1][y1], -1); a[x1][y1] = c; change(x1, y1, c, 1); } else { scanf("%d%d%d%d%d", &x1, &x2, &y1, &y2, &c); int ans = query(x2, y2, c) - query(x1 - 1, y2, c) - query(x2, y1 - 1, c) + query(x1 - 1, y1 - 1, c); printf("%d\n", ans); } } }
- 1
信息
- ID
- 3105
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 19
- 已通过
- 11
- 上传者