zoukankan      html  css  js  c++  java
  • POJ 2155 Matrix

    Matrix
    Time Limit: 3000MS   Memory Limit: 65536K
    Total Submissions: 14330   Accepted: 5411

    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
    题目大意:输入为C则输入左上角和右下角坐标,然后将这两点中间的矩阵的所有元素取反,输入为Q则输入某一点的坐标,并求出对应坐标点的值
    #include <stdio.h>
    #include <cstring>
    #include <iostream>
    using namespace std;
    
    #define  MAXNUM  1005
    int t[MAXNUM][MAXNUM];
    int N;
    
    int lowbit(int x)
    {
        return x & -x;
    }
    
    void add(int x, int y, int num)
    {
        for (int i = x; i > 0; i -= lowbit(i))
        {
            for (int j = y; j > 0; j -= lowbit(j))
            {
                t[i][j] ^= num;
            }
        }
    }
    
    int getsum(int x, int y)
    {
        int sum = 0;
        for (int i = x; i <= N; i += lowbit(i))
        {
            for (int j = y; j <= N; j += lowbit(j))
            {
                sum ^= t[i][j];
            }
        }
        return sum;
    }
    
    int main()
    {
        int ncase;
        int M;
        scanf("%d", &ncase);
        while(ncase--)
        {
            memset(t, 0, sizeof(t));
            scanf("%d%d", &N, &M);
            while(M--)
            {
                char c;
                getchar();
                scanf("%c", &c);
                if (c == 'C')
                {
                    int x1, y1, x2, y2;
                    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
                    add(x2, y2, 1);
                    add(x1 - 1, y2, 1);
                    add(x2, y1 - 1, 1);
                    add(x1 - 1, y1 - 1, 1);
                }
                else
                {
                    int x ,y;
                    scanf("%d%d", &x, &y);
                    printf("%d\n", getsum(x, y));
                }
            }
            printf("\n");
        }
        return 0;
    }
  • 相关阅读:
    poj 1088 滑雪
    位运算与bitset
    hdu 4607 Park Visit
    树的直径
    codeforces 495D Sonya and Matrix
    German Collegiate Programming Contest 2015(第三场)
    BAPC 2014 Preliminary(第一场)
    Benelux Algorithm Programming Contest 2014 Final(第二场)
    E. Reachability from the Capital(tarjan+dfs)
    poj2104 K-th Number(划分树)
  • 原文地址:https://www.cnblogs.com/lzmfywz/p/3113585.html
Copyright © 2011-2022 走看看