啥都不会啊!怎么办啊!

Fitz

慢慢来生活总会好起来的!!!

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("******\n")
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\n", getans(x, y) % 2);
71             }
72         }
73         printf("\n");
74     }
75     return 0;
76 }

 

posted @ 2018-08-03 08:49  Fitz~  阅读(391)  评论(0编辑  收藏  举报