hdu 5465 树状数组

因为xor具有前缀和性质,所以可以建立一颗二维树状数组,写起来只是稍微有点改变,感觉此题还是很不错的,结合了数据结构和博弈。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5
 6 const int N = 501;
 7 int a[N][N];
 8 int c[N][N];
 9 int n, m, q;
10
11 int lb( int i )
12 {
13     return i & -i;
14 }
15
16 void update( int i, int j, int val )
17 {
18     for ( int ii = i; ii <= n; ii += lb(ii) )
19     {
20         for ( int jj = j; jj <= m; jj += lb(jj) )
21         {
22             c[ii][jj] ^= val;
23         }
24     }
25 }
26
27 int sum( int i, int j )
28 {
29     int res = 0;
30     for ( int ii = i; ii > 0; ii -= lb(ii) )
31     {
32         for ( int jj = j; jj > 0; jj -= lb(jj) )
33         {
34             res ^= c[ii][jj];
35         }
36     }
37     return res;
38 }
39
40 int query( int x1, int y1, int x2, int y2 )
41 {
42     int p = sum( x2, y2 );
43     int q = sum( x1 - 1, y2 );
44     int r = sum( x2, y1 - 1 );
45     int s = sum( x1 - 1, y1 - 1 );
46     return p ^ q ^ r ^ s;
47 }
48
49 int main ()
50 {
51     int t;
52     scanf("%d", &t);
53     while ( t-- )
54     {
55         scanf("%d%d%d", &n, &m, &q);
56         memset( a, 0, sizeof(a) );
57         memset( c, 0, sizeof(c) );
58         for ( int i = 1; i <= n; i++ )
59         {
60             for ( int j = 1; j <= m; j++ )
61             {
62                 scanf("%d", &a[i][j]);
63                 update( i, j, a[i][j] );
64             }
65         }
66         while ( q-- )
67         {
68             int opt;
69             scanf("%d", &opt);
70             if ( opt == 1 )
71             {
72                 int x1, y1, x2, y2;
73                 scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
74                 if ( query( x1, y1, x2, y2 ) )
75                 {
76                     puts("Yes");
77                 }
78                 else
79                 {
80                     puts("No");
81                 }
82             }
83             else
84             {
85                 int x, y, z;
86                 scanf("%d%d%d", &x, &y, &z);
87                 update( x, y, a[x][y] ^ z );
88                 a[x][y] = z;
89             }
90         }
91     }
92     return 0;
93 }
时间: 2024-10-18 10:41:16

hdu 5465 树状数组的相关文章

hdu 3333 树状数组+离线处理

http://acm.hdu.edu.cn/showproblem.php?pid=3333 不错的题,想了很久不知道怎么处理,而且答案没看懂,然后找个例子模拟下别人的代码马上懂了---以后看不懂的话就拿个例子模拟下别人的代码 举个例子:1 3 3 5 3 5 查询 a, 2 4 b, 2 5 最初是这么想的:对于a查询,倘若把第二个数第三个数变成1个3,那么到b查询,又出现了两个3,再做处理似乎还是O(n),而且如果先出现2,5查询,后出现2,4查询,那么还需要把删除的数补回来.....o(╯

Hdu 3887树状数组+模拟栈

题目链接 Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1757    Accepted Submission(s): 582 Problem Description You are given a tree, it’s root is p, and the node is numbered fr

HDU 1754 树状数组 解法

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

HDU 1166(树状数组)

用树状数组把HDU1166再写了一次  感觉树状数组简洁 1 #include <cstdio> 2 #include <iostream> 3 #include <string.h> 4 using namespace std; 5 int c[50002],lv[50002],n; 6 int lowbit(int x){return x&(-x);} 7 int sum(int b){ 8 int sum=0; 9 while(b>0){ 10 su

hdu 4368 树状数组 离线维护

http://acm.hdu.edu.cn/showproblem.php?pid=4638 Problem Description There are n men ,every man has an ID(1..n).their ID is unique. Whose ID is i and i-1 are friends, Whose ID is i and i+1 are friends. These n men stand in line. Now we select an interv

hdu 4630 树状数组+离线操作+GCD

http://acm.hdu.edu.cn/showproblem.php?pid=4630 重新认识了树状数组. 首先要记住那个树形的图,然后+或-lowbit(i)是自己根据具体问题设定的,不要死于+或者-, 树状数组的特点: 1.+lowbit(i)可以到达包含结点i的上一层父节点    所以用于值的更改 2.-lowbit(i)可以到达不包含i所代表区间的上一层父节点  所以用于值的求和---每个不相交的段加起来 3.C[i]的含义也是根据具体问题去做设定的,但是c[i]覆盖了a[i-2

HDU 1394 树状数组(逆序数)

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10100    Accepted Submission(s): 6192 Problem Description The inversion number of a given number sequence a1, a2, ..., an

hdu 4970 树状数组区间更新 思维题

http://acm.hdu.edu.cn/showproblem.php?pid=4970 好像还没有用树状数组写过区间更新,但是树状数组的确比线段树快很多,不知道跟ZKW线段树比效率怎么样: 先贴个模板: #include <cstdio> const int MAXN = 1024; int B[MAXN], C[MAXN]; #define LOWBIT(x) ((x)&(-(x))) void bit_update(int *a, int p, int d) { for (

hdu 2492(树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Ping pong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4011    Accepted Submission(s): 1482 Problem Description N(3<=N<=20000) ping pong