• POJ 2155 Matrix【二维树状数组】POJ 2155【


    Description

    Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1 <= i, j <= N).

    We can change the matrix in the following way. Given a rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2), we change all the elements in the rectangle by using "not" operation (if it is a '0' then change it into '1' otherwise change it into '0'). To maintain the information of the matrix, you are asked to write a program to receive and execute two kinds of instructions.

    1. C x1 y1 x2 y2 (1 <= x1 <= x2 <= n, 1 <= y1 <= y2 <= n) changes the matrix by using the rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2).
    2. Q x y (1 <= x, y <= n) querys A[x, y].

    Input

    The first line of the input is an integer X (X <= 10) representing the number of test cases. The following X blocks each represents a test case.

    The first line of each block contains two numbers N and T (2 <= N <= 1000, 1 <= T <= 50000) representing the size of the matrix and the number of the instructions. The following T lines each represents an instruction having the format "Q x y" or "C x1 y1 x2 y2", which has been described above.

    Output

    For each querying output one line, which has an integer representing A[x, y].

    There is a blank line between every two continuous test cases.

    Sample Input

    1
    2 10
    C 2 1 2 2
    Q 2 2
    C 2 1 2 1
    Q 1 1
    C 1 1 2 1
    C 1 2 1 2
    C 1 1 2 2
    Q 1 1
    C 1 1 2 1
    Q 2 1
    

    Sample Output

    1
    0
    0
    1
    

    思路:二维树状数组快速求数字子矩阵的和.
    代码如下:
    View Code
    #include<stdio.h>
    #include<string.h>
    int c[1005][1005], n; 
    int Lowbit(int t)
    {
        return t&(-t);
    }
    void add(int x, int y, int val)
    {
        int i=y;
        while(x<=n)
        {
            y=i;
            while(y<=n)
            {
                c[x][y]+=val;
                y+=Lowbit(y);
            }
            x+=Lowbit(x);
        }
    }
    int Sum(int x, int y)
    {
        int i=y, sum=0;
        while(x>0)
        {
            y=i;
            while(y>0)
            {
                sum+=c[x][y];
                y-=Lowbit(y);
            }
            x-=Lowbit(x);
        }
        return sum;
    }
    int main()
    {
        int T, m, x1, y1, x2, y2, i;
        char ch; 
        scanf("%d", &T);
        while(T--)
        {
            scanf("%d%d", &n, &m);
            memset(c, 0, sizeof(c)); 
            getchar();
            for(i=0; i<m; i++)
            {
                scanf("%c", &ch); 
                if(ch=='C')
                {
                    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
                    x2++, y2++; 
                    add(x1, y1, 1);
                    add(x2, y2, 1);
                    add(x1, y2, -1);
                    add(x2, y1, -1);
                }
                else
                {
                    scanf("%d%d", &x1, &y1);
                    printf("%d\n", Sum(x1, y1)%2);
                }
                getchar(); 
            }
            printf("\n"); 
        }
    } 
  • 相关阅读:
    javasscript学习笔记 之 数组学习二 数组的所有方法
    JavaScript学习笔记之 数组方法一 堆栈 和队列
    JavaScript学习笔记:检测数组方法
    _bzoj1500 [NOI2005]维修数列【真·Splay】
    _bzoj1012 [JSOI2008]最大数maxnumber【Fenwick Tree】
    _bzoj1010 [HNOI2008]玩具装箱toy【斜率优化dp】
    _bzoj3224 Tyvj 1728 普通平衡树【Splay】
    _bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【分块】
    _bzoj1001 [BeiJing2006]狼抓兔子【平面图】
    _bzoj1036 [ZJOI2008]树的统计Count【树链剖分】
  • 原文地址:https://www.cnblogs.com/Hilda/p/2629572.html
Copyright © 2020-2023  润新知