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

    题目是让每次对一个子矩阵进行翻转(0变1,1变0),

    然后有多次询问,询问某个点是0还是1

    这题可以用二维的树状数组来解决,考虑传统的树状数组是改变某个点,然后查询某一段,
    而这个题是改变某一段,查询某个点,需要进行一下转换,将原来的改值变成查询,
    查询变成改值。改制时相当于对区间分别进行修改,而查询某个点时,
    就是将 覆盖这个点的区间全加起来,然后把一维的改成二维的就可以了。
     
     
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <queue>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <set>
     7 #include <iostream>
     8 #include <map>
     9 #include <stack>
    10 #include <string>
    11 #include <vector>
    12 #define pi acos(-1.0)
    13 #define eps 1e-6
    14 #define fi first
    15 #define se second
    16 #define lson l,m,rt<<1
    17 #define rson m+1,r,rt<<1|1
    18 #define bug         printf("******
    ")
    19 #define mem(a,b)    memset(a,b,sizeof(a))
    20 #define fuck(x)     cout<<"["<<x<<"]"<<endl
    21 #define f(a)        a*a
    22 #define sf(n)       scanf("%d", &n)
    23 #define sff(a,b)    scanf("%d %d", &a, &b)
    24 #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
    25 #define pf          printf
    26 #define FRE(i,a,b)  for(i = a; i <= b; i++)
    27 #define FREE(i,a,b) for(i = a; i >= b; i--)
    28 #define FRL(i,a,b)  for(i = a; i < b; i++)
    29 #define FRLL(i,a,b) for(i = a; i > b; i--)
    30 #define FIN freopen("DATA.txt","r",stdin)
    31 #define lowbit(x)   x&-x
    32 #pragma comment (linker,"/STACK:102400000,102400000")
    33 
    34 using namespace std;
    35 typedef long long LL ;
    36 const int maxn = 1e3 + 10;
    37 int n, m;
    38 int c[maxn][maxn];
    39 void update(int x, int y) {
    40     for (int i = x ; i <= n ; i += lowbit(i))
    41         for (int j = y ; j <= n ; j += lowbit(j))
    42             c[i][j]++;
    43 }
    44 int getans(int x, int y) {
    45     int sum = 0;
    46     for (int i = x ; i > 0 ; i -= lowbit(i))
    47         for (int j = y ; j > 0 ; j -= lowbit(j))
    48             sum += c[i][j];
    49     return sum;
    50 }
    51 int main() {
    52     int t, x1, y1, x2, y2;
    53     char op[10];
    54     scanf("%d", &t);
    55     while(t--) {
    56         mem(c, 0);
    57         scanf("%d%d", &n, &m);
    58         while(m--) {
    59             scanf("%s", op);
    60             if (op[0] == 'C') {
    61                 scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
    62                 x1++, y1++, x2++, y2++;
    63                 update(x2, y2);
    64                 update(x1 - 1, y1 - 1);
    65                 update(x1 - 1, y2);
    66                 update(x2, y1 - 1);
    67             } else {
    68                 int x, y;
    69                 scanf("%d%d", &x, &y);
    70                 printf("%d
    ", getans(x, y) % 2);
    71             }
    72         }
    73         printf("
    ");
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    JavaWeb——库存管理系统(1)jsp部分---18.12.13
    Java——多线程---18.11.22
    Java——异常处理---18.11.14
    Java——final代码块是否一定被执行---18.11.08
    暑期的周总结们
    Javaweb——四则运算---18.11.01
    Java——equals方法---18.10.18
    微信小程序记账本进度六
    微信小程序记账本进度七
    微信小程序记账本进度一
  • 原文地址:https://www.cnblogs.com/qldabiaoge/p/9411401.html
Copyright © 2011-2022 走看看