zoukankan      html  css  js  c++  java
  • poj 2155 Matrix---树状数组套树状数组

    二维树状数组模版,唯一困难,看题!!(其实是我英语渣)
    Matrix
    Time Limit: 3000MS Memory Limit: 65536K
    Total Submissions: 22098 Accepted: 8240

    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].
      题目大意:
      给出t个n*n的矩阵,初始都是0,并给一个m,给出m个命令:
      命令“C x1 y1 x2 y2”将(x1,y1)–(x2,y2)上每个点进行交换(0变为1,1变为0)
      命令“Q x y”求(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
    前排膜娄教主%%%

    这个题的话,值得一提的就是:
    在修改(x1,y1)--(x2,y2)的时候,应用区间修改的原理只需要修改(x1,y1),(x2+1,y1),(x1,y2+1),(x2+1,y2+1)即可
    以及每个记录的值是变换过几次的值,所以结果%2即可
    
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int matrix[2000][2000]={0};
    int t,n;
    
    int lowbit(int x)
    {
        return x&(-x);
    }
    
    int sum(int x,int y)
    {
        int total=0;
        for (int i=x; i>0; i-=lowbit(i))
            for (int j=y; j>0; j-=lowbit(j))
                total+=matrix[i][j];
        return total;
    }
    
    void change(int x,int y)
    {
        for (int i=x; i<=n; i+=lowbit(i))
            for (int j=y; j<=n; j+=lowbit(j))
                matrix[i][j]++;
    }
    
    int main()
    {
        scanf("%d",&t);
        for (int T=1; T<=t; T++)
            {
                int m;
                scanf("%d%d",&n,&m);
                memset(matrix,0,sizeof(matrix));
                while (m>0)
                    {
                        char command[10];
                        scanf("%s",&command);
                        if (command[0]=='C')
                            {
                                int x1,x2,y1,y2;
                                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                                change(x1,y1);
                                change(x2+1,y1);
                                change(x1,y2+1);
                                change(x2+1,y2+1);
                            }
                        if (command[0]=='Q')
                            {
                                int x,y;
                                scanf("%d%d",&x,&y);
                                int ans=sum(x,y) % 2;
                                printf("%d
    ",ans);
                            }
                        m--;
                    }
                printf("
    ");
            }
        return 0;
    }
  • 相关阅读:
    POJ 2251 Dungeon Master
    HDU 3085 Nightmare Ⅱ
    CodeForces 1060 B Maximum Sum of Digits
    HDU 1166 敌兵布阵(树状数组)
    HDOJ 2050 折线分割平面
    HDU 5879 Cure
    HDU 1878 欧拉回路
    HDU 6225 Little Boxes
    ZOJ 2971 Give Me the Number
    HDU 2680 Choose the best route
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346262.html
Copyright © 2011-2022 走看看