zoukankan      html  css  js  c++  java
  • POJ-2155 Matrix---二维树状数组+区域更新单点查询

    题目链接:

    https://vjudge.net/problem/POJ-2155

    题目大意:

    给一个n*n的01矩阵,然后有两种操作(m次)C x1 y1 x2 y2是把这个小矩形内所有数字异或一遍,Q x y 是询问当前这个点的值是多少?n<=1000 m<=50000.

    解题思路:

    裸的二维树状数组,但是这里是区域更新,单点查询,

    做法应该是

     1  #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<string>
     6 #include<cmath>
     7 #include<set>
     8 #include<queue>
     9 #include<map>
    10 #include<stack>
    11 #include<vector>
    12 #include<list>
    13 #include<deque>
    14 #include<sstream>
    15 #include<cctype>
    16 #define REP(i, n) for(int i = 0; i < (n); i++)
    17 #define FOR(i, s, t) for(int i = (s); i < (t); i++)
    18 using namespace std;
    19 typedef long long ll;
    20 typedef unsigned long long ull;
    21 const int maxn = 1e3 + 10;
    22 const double eps = 1e-10;
    23 const int INF = 1 << 30;
    24 const int dir[4][2] = {1,0,0,1,0,-1,-1,0};
    25 const double pi = 3.1415926535898;
    26 int T, n, m, cases;
    27 int tree[maxn][maxn];
    28 int lowbit(int x)
    29 {
    30     return x&(-x);
    31 }
    32 int sum(int x, int y)
    33 {
    34     int ret = 0;
    35     for(int i = x; i <= n; i += lowbit(i))
    36     {
    37         for(int j = y; j <= n; j += lowbit(j))
    38             ret += tree[i][j];
    39     }
    40     return ret;
    41 }
    42 void add(int x, int y, int d)
    43 {
    44     for(int i = x; i > 0; i -= lowbit(i))
    45     {
    46         for(int j = y; j > 0; j -= lowbit(j))
    47             tree[i][j] += d;
    48     }
    49 }
    50 int main()
    51 {
    52     std::ios::sync_with_stdio(false);
    53     cin >> T;
    54     while(T--)
    55     {
    56         cin >> n >> m;
    57         string c;
    58         int x1, y1, x2, y2;
    59         memset(tree, 0, sizeof(tree));
    60         while(m--)
    61         {
    62             cin >> c;
    63             if(c[0] == 'C')
    64             {
    65                 cin >> x1 >> y1 >> x2 >> y2;
    66                 add(x2, y2, 1);
    67                 add(x1 - 1, y1 - 1, 1);
    68                 add(x2, y1 - 1, -1);
    69                 add(x1 - 1, y2, -1);
    70             }
    71             else if(c[0] == 'Q')
    72             {
    73                 cin >> x1 >> x2;
    74                 cout<<(sum(x1, x2)&1)<<endl;
    75             }
    76         }
    77         if(T)cout<<endl;
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    mysql分表技术(学习心得)
    Linux下搭建DNS服务器
    php简单单例模式
    JQuery的ajaxFileUpload图片上传初试
    Binary Tree Level Order Traversal II
    Remove Element
    Symmetric Tree
    Balanced Binary Tree
    Power of Two
    Merge Two Sorted Lists
  • 原文地址:https://www.cnblogs.com/fzl194/p/8947040.html
Copyright © 2011-2022 走看看