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

    题目链接:

    解题思路:首先考虑一维的情况,更改某个区间[l, r]时相当于l出加一,r + 1除减一,这样就能保证每次计算的时候两者总是能抵消的。当然也可以在l与r + 1除都加一,而每次求和之后mod 2。

    接下来考虑二维,更改区间[x1, y1], [x2, y2]的时候,只需在(x1, y1), (x1, y2 + 1), (x2 + 1, y1), (x2 + 1, y2 + 1)四个点除加一即可(好吧其实我只推出了一维,二维是看别人博客的)。然后求和就交给二维树状数组了。

    比较有意思的是,当一个函数这样写的时候

    1 void add(int i, int j, int val){
    2     for(i; i <= n; i += lowbit(i)){
    3         for(j; j <= n; j += lowbit(j)){
    4             bit[i][j] += val;
    5         }
    6     } 
    7 }

    得到的结果竟然是错误的,不知道是什么bug。

    代码:

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include <functional>
     3 #include <algorithm>
     4 #include <iostream>
     5 #include <cstring>
     6 #include <cassert>
     7 #include <cstdio>
     8 #include <cctype>
     9 #include <vector>
    10 #include <string>
    11 #include <queue>
    12 #include <stack>
    13 #include <cmath>
    14 #include <map>
    15 #include <set>
    16 using namespace std;
    17 #define rep(i,a,n) for (int i=a;i<n;i++)
    18 #define per(i,a,n) for (int i=n-1;i>=a;i--)
    19 #define pb push_back
    20 #define mp make_pair
    21 #define all(x) (x).begin(),(x).end()
    22 #define fi first
    23 #define se second
    24 #define SZ(x) ((int)(x).size())
    25 typedef vector<int> VI;
    26 typedef long long ll;
    27 typedef pair<int, int> PII;
    28 const ll mod = 1000000007;
    29 ll powmod(ll a, ll b) { ll res = 1; a %= mod; assert(b >= 0); for (; b; b >>= 1) { if (b & 1)res = res*a%mod; a = a*a%mod; }return res; }
    30 // head
    31 const int inf = 0x3f3f3f3f;
    32 const int maxn = 1010;
    33 
    34 int bit[maxn][maxn], n;
    35 
    36 int lowbit(int x){
    37     return x & (-x);
    38 }
    39 int sum(int x, int y){
    40     int ans = 0;
    41     for(int i = x; i > 0; i -= lowbit(i)){
    42         for(int j = y ; j > 0; j -= lowbit(j)){
    43             ans += bit[i][j];
    44         }
    45     }
    46     return ans;
    47 }
    48 void add(int x, int y, int val){
    49     for(int i = x; i <= n; i += lowbit(i)){
    50         for(int j = y; j <= n; j += lowbit(j)){
    51             bit[i][j] += val;
    52         }
    53     } 
    54 }
    55 
    56 int main(){
    57     int T;
    58     scanf("%d", &T);
    59     while(T--){
    60         memset(bit, 0, sizeof(bit));
    61         int m;
    62         scanf("%d %d", &n, &m);
    63         while(m--){
    64             char ch;
    65             scanf(" %c", &ch);
    66             if(ch == 'C'){
    67                 int x1, y1, x2, y2;
    68                 scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
    69                 
    70                 add(x1, y1, 1); 
    71                 add(x2 + 1, y1, 1);
    72                 add(x1, y2 + 1, 1);
    73                 add(x2 + 1, y2 + 1, 1);
    74                 
    75             }
    76             else{
    77                 int x1, y1;
    78                 scanf("%d %d", &x1, &y1);
    79                 if(sum(x1, y1) % 2 == 0) puts("0");
    80                 else puts("1");
    81             }
    82         }
    83         if(T)
    84             puts("");
    85     }
    86 }

    题目:

    Matrix
    Time Limit: 3000MS   Memory Limit: 65536K
    Total Submissions: 28786   Accepted: 10494

    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
  • 相关阅读:
    LVS基于DR模式负载均衡的配置
    Linux源码安装mysql 5.6.12 (cmake编译)
    HOSt ip is not allowed to connect to this MySql server
    zoj 3229 Shoot the Bullet(无源汇上下界最大流)
    hdu 3987 Harry Potter and the Forbidden Forest 求割边最少的最小割
    poj 2391 Ombrophobic Bovines(最大流+floyd+二分)
    URAL 1430 Crime and Punishment
    hdu 2048 神、上帝以及老天爷(错排)
    hdu 3367 Pseudoforest(最大生成树)
    FOJ 1683 纪念SlingShot(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/bolderic/p/7290981.html
Copyright © 2011-2022 走看看