1 条题解

  • 1
    @ 2023-8-21 16:09:41

    我们只要使用类似于树状数组套树状数组的数据结构维护就可以了。

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 310, M = 110;
    
    int tr[N][N][M];
    
    void add(int x, int y, int c, int v) {
    	x++, y++;
    	while (x < N) {
    		int by = y;
    		while (y < N) {
    			tr[x][y][c] += v;
    			y += y & -y;
    		}
    		y = by;
    		x += x & -x;
    	}
    }
    
    int query(int x, int y, int c) {
    	int sum = 0;
    	x++, y++;
    	while (x) {
    		int by = y;
    		while (y) {
    			sum += tr[x][y][c];
    			y -= y & -y;
    		}
    		y = by;
    		x -= x & -x;
    	}
    	return sum;
    }
    
    int n, m, q;
    int a[N][N];
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr);
    	
    	cin >> n >> m;
    	for (int i = 1; i <= n; i++) {
    		for (int j = 1; j <= m; j++) {
    			cin >> a[i][j];
    			add(i, j, a[i][j], 1);
    		}
    	}
    	
    	cin >> q;
    	int opt, x1, y1, x2, y2, c;
    	while (q--) {
    		cin >> opt;
    		if (opt == 1) {
    			cin >> x1 >> y1 >> c;
    			add(x1, y1, a[x1][y1], -1);
    			add(x1, y1, c, 1);
    			a[x1][y1] = c;
    		}
    		else {
    			cin >> x1 >> x2 >> y1 >> y2 >> c;
    			int ans = query(x2, y2, c) - query(x2, y1 - 1, c) - query(x1 - 1, y2, c) + query(x1 - 1, y1 - 1, c);
    			cout << ans << '\n';
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    2986
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    1
    已通过
    1
    上传者