• POJ 2155 Matrix


    Matrix
    Time Limit: 3000MS   Memory Limit: 65536K
    Total Submissions: 24547   Accepted: 9085

    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
    

    Source

    POJ Monthly,Lou Tiancheng
     
     
     
    解析:二维树状数组(区间更新,单点查询)。解答原理参考《浅谈信息学竞赛中的“0”和“1”》。
     
     
     
    #include <cstdio>
    #include <cstring>
    #define lowbit(x) (x)&(-x)
    
    int n, t, q;
    int c[1005][1005];
    char op[2];
    int x1, y1, x2, y2;
    
    void add(int x, int y, int val)
    {
        for(int i = x; i <= n; i += lowbit(i))
            for(int j = y; j <= n; j += lowbit(j))
                c[i][j] += val;
    }
    
    int sum(int x, int y)
    {
        int ret = 0;
        for(int i = x; i > 0; i -= lowbit(i))
            for(int j = y; j > 0; j -= lowbit(j))
                ret += c[i][j];
        return ret;
    }
    
    void solve()
    {
        scanf("%d%d", &n, &q);
        memset(c, 0, sizeof(c));
        while(q--){
            scanf("%s", op);
            if(op[0] == 'C'){
                scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
                add(x1, y1, 1);
                add(x2+1, y2+1, 1);
                add(x1, y2+1, 1);
                add(x2+1, y1, 1);
            }
            else{
                scanf("%d%d", &x1, &y1);
                printf("%d
    ", sum(x1, y1)&1);
            }
        }
    }
    
    int main()
    {
        scanf("%d", &t);
        while(t--){
            solve();
            printf("
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    系统设计5:Google三剑客
    lintcode亚麻九题
    设计模式17:单例模式
    设计模式16:迭代器模式
    设计模式15:组合模式
    476. Number Complement
    561. Array Partition I
    627. Swap Salary
    617. Merge Two Binary Trees
    728. Self Dividing Numbers
  • 原文地址:https://www.cnblogs.com/inmoonlight/p/5724020.html
Copyright © 2020-2023  润新知