POJ 2155 Matrix 二维树状数组

http://blog.csdn.net/u013368721/article/details/32333865

二维树状数组,是一维的演变版,没什么太大改动

要注意的是,这里数组必须重新定义,不能是默认定义a[i][j]表示a[i][j]的值,否则二维树状数组只能做到单点修改,区间查询,但此题需要区间修改。

所以不妨换定义,定义a[i][j]表示 a[ i1 ] [ j1 ] ( i =< i1 <= n && j <= j1 <= n )所有值之和,那么修改时,只需将 a [ x1 ][ y1 ] += 1, a [ x1 ][ y2 + 1 ] -= 1; a [ x2 ][ y1 + 1] -= 1; a[ x2 + 1 ][ y2 + 1 ] +=1; 这个操作不是简单的 +1 -1,而是在二维树状数组上进行。

如此,查找时,只需查找 a[x][y] 即可,这也不是简单的查找a[x][y],而是在二维树状数组上进行。具体看代码。

二维线段树个人还不会,一会学学博主的。

My code (Java)

import java.util.*;


public class Main {
    public static void main(String[] agrs){
        Scanner input = new Scanner(System.in);

        int T = input.nextInt();
        int n, m;
        BIT bit;

        for(int kase = 1; kase <= T; kase++){
            if(kase > 1) System.out.println();

            n = input.nextInt(); m = input.nextInt();
            bit = new BIT(n);

            for(int i = 1; i <= m; i++){
                String s = input.next();

                if(s.charAt(0) == 'C'){
                    int x1, y1, x2, y2;
                    x1 = input.nextInt();
                    y1 = input.nextInt();
                    x2 = input.nextInt();
                    y2 = input.nextInt();

                    bit.update(x1 , y1, +1);
                    bit.update(x1, y2 + 1, -1);
                    bit.update(x2 + 1, y1, -1);
                    bit.update(x2 + 1, y2 + 1, +1);
                }
                else{
                    int x, y;
                    x = input.nextInt();
                    y = input.nextInt();

                    int ans = bit.query(x, y);
                    ans = (ans % 2 + 2) % 2;

                    System.out.println(ans);
                }
            }
        }

        input.close();
    }
}


class BIT{
    int[][] a;
    int n;

    public BIT(int n){
        this.n = n;
        a = new int[n + 10][n + 10];
    }

    public void update(int x,int y,int val){
        for(int i = x; i <= n; i += i&-i){
            for(int j = y; j <= n; j += j&-j){
                a[i][j] += val;
                a[i][j] = (a[i][j] % 2 + 2) % 2;
            }
        }
    }

    public int query(int x,int y){
        int ans = 0;
        for(int i = x; i > 0; i -= i&-i){
            for(int j = y; j > 0; j -= j&-j){
                ans = (ans + a[i][j]) % 2;
            }
        }
        return ans;
    }
}

你可能感兴趣的:(二维树状数组)