zoukankan      html  css  js  c++  java
  • POJ 2155 Matrix (二维树状数组)

    Matrix
    Time Limit: 3000MS   Memory Limit: 65536K
    Total Submissions: 17224   Accepted: 6460

    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

    很裸的题。

    可以使用二维树状数组。

    二维的写起来很方便,两重循环。

    如果是要修改(x1,y1)  -  (x2,y2)的矩形区域。

    那么可以在(x1,y1) 出加1,在(x2+1,y1)处加1,在(x1,y2+1)处加1,在(x2+1,y2+1)处加1 。。

    画个图就知道了,查询单点就是求和。

     1 /* ***********************************************
     2 Author        :kuangbin
     3 Created Time  :2014/5/23 22:34:04
     4 File Name     :E:2014ACM专题学习数据结构二维树状数组POJ2155.cpp
     5 ************************************************ */
     6 
     7 #include <stdio.h>
     8 #include <string.h>
     9 #include <iostream>
    10 #include <algorithm>
    11 #include <vector>
    12 #include <queue>
    13 #include <set>
    14 #include <map>
    15 #include <string>
    16 #include <math.h>
    17 #include <stdlib.h>
    18 #include <time.h>
    19 using namespace std;
    20 const int MAXN = 1010;
    21 int lowbit(int x)
    22 {
    23     return x&(-x);
    24 }
    25 int c[MAXN][MAXN];
    26 int n;
    27 int sum(int x,int y)
    28 {
    29     int ret = 0;
    30     for(int i = x;i > 0;i -= lowbit(i))
    31         for(int j = y;j > 0;j -= lowbit(j))
    32             ret += c[i][j];
    33     return ret;
    34 }
    35 void add(int x,int y,int val)
    36 {
    37     for(int i = x;i <= n;i += lowbit(i))
    38         for(int j = y;j <= n;j += lowbit(j))
    39             c[i][j] += val;
    40 }
    41 
    42 int main()
    43 {
    44     //freopen("in.txt","r",stdin);
    45     //freopen("out.txt","w",stdout);
    46     int T;
    47     scanf("%d",&T);
    48     while(T--)
    49     {
    50         int q;
    51         scanf("%d%d",&n,&q);
    52         memset(c,0,sizeof(c));
    53         char op[10];
    54         int x1,y1,x2,y2;
    55         while(q--)
    56         {
    57             scanf("%s",op);
    58             if(op[0] == 'C')
    59             {
    60                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    61                 add(x1,y1,1);
    62                 add(x2+1,y1,1);
    63                 add(x1,y2+1,1);
    64                 add(x2+1,y2+1,1);
    65             }
    66             else
    67             {
    68                 scanf("%d%d",&x1,&y1);
    69                 if(sum(x1,y1)%2 == 0)printf("0
    ");
    70                 else printf("1
    ");
    71             }
    72         }
    73         if(T > 0)printf("
    ");
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    Java中List和ArrayList的区别(转)
    Java的JDBC事务详解(转)
    Java JDBC批处理插入数据操作(转)
    celery入门
    Python装饰器与面向切面编程
    python 中类方法@classmethod
    Virtualenv: 一个Python环境管理工具(windown版本)
    python操作excel之 模块 xlrd
    django多条件筛选搜索(项目实例)
    jQuery选择器总结
  • 原文地址:https://www.cnblogs.com/kuangbin/p/3749030.html
Copyright © 2011-2022 走看看