zoukankan      html  css  js  c++  java
  • Matrix(poj2155)

    Matrix
    Time Limit: 3000MS   Memory Limit: 65536K
    Total Submissions: 25139   Accepted: 9314

    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

    思路:二维树状数组;

    http://download.csdn.net/detail/lenleaves/4548401

    这个解释的很好;

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<stdlib.h>
     5 #include<queue>
     6 #include<string.h>
     7 using namespace std;
     8 int bit[1005][1005];
     9 int lowbit(int x)
    10 {
    11         return x&(-x);
    12 }
    13 void add(int x,int y)
    14 {
    15         int i,j;
    16         for(i = x; i <= 1000; i+=lowbit(i))
    17         {
    18                 for(j = y; j <= 1000; j+=lowbit(j))
    19                 {
    20                         bit[i][j]+=1;
    21                         bit[i][j]%=2;
    22                 }
    23         }
    24 }
    25 int ask(int x,int y)
    26 {
    27         int i,j;
    28         int sum = 0;
    29         for(i = x; i > 0; i-=lowbit(i))
    30         {
    31                 for(j = y; j > 0; j-=lowbit(j))
    32                 {
    33                         sum += bit[i][j];
    34                 }
    35         }
    36         return sum%2;
    37 }
    38 int main(void)
    39 {
    40         int T;
    41         scanf("%d ",&T);
    42         while(T--)
    43         {
    44                 memset(bit,0,sizeof(bit));
    45                 int i,j;
    46                 int N,q;
    47                 scanf("%d %d ",&N,&q);
    48                 char a[10];
    49                 while(q--)
    50                 {
    51                         scanf("%s",a);
    52                         int x,y,x1,y1;
    53                         if(a[0] == 'C')
    54                         {
    55                                 scanf("%d %d %d %d",&x,&y,&x1,&y1);
    56                                 add(x,y);
    57                                 add(x1+1,y1+1);
    58                                 add(x,y1+1);
    59                                 add(x1+1,y);
    60                         }
    61                         else
    62                         {
    63                                 scanf("%d %d",&x,&y);
    64                                 int ac = ask(x,y);
    65                                 printf("%d
    ",ac);
    66                         }
    67                 }
    68                 printf("
    ");
    69         }
    70         return 0;
    71 }
    油!油!you@
  • 相关阅读:
    Oracle ORA07445 [evaopn3()+384] 错误 分析
    Openfiler iscsiadm: No portals found 解决方法
    Openfiler iscsiadm: No portals found 解决方法
    ORA00600 [kmgs_parameter_update_timeout_1], [27072] ORA27072 解决方法
    Oracle 安装 Error in writing to directory /tmp/OraInstall 错误 说明
    Oracle alert log ALTER SYSTEM SET service_names='','SYS$SYS.KUPC$C_...' SCOPE=MEMORY SID='' 说明
    Oracle latch:library cache 导致 数据库挂起 故障
    ORA600 [4194] 说明
    ORA00600:[32695], [hash aggregation can't be done] 解决方法
    Oracle 10g Rac root.sh Failure at final check of Oracle CRS stack 10 解决方法
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5893974.html
Copyright © 2011-2022 走看看