`

poj 2155

 
阅读更多

题意:一个n*n的01矩阵,和几种动态操作,包括对子矩阵(x,y,xx,yy)的所有元素异或,查询某一点(x,y)的元素值。
 
思路:二维树状数组。异或操作不难修改,重点这道题目与普通的树状数组不同的是:普通的树状数组一般是修改点,查询区域;而这里是修改区域,查询点。所以要对普通的add()函数和sum()函数进行对调修改,这里要对两个函数的性质了解清楚,可以先从一维的树状数组理解入手,再按二维的模板去写。

 

代码如下:

#include<iostream>
using namespace std;
const int Max = 1005;

int n, m;
bool ar[Max][Max];

int lowbit(int x)
{
    return x & (-x);
}

void updata(int i, int j)
{
    int tmpj;
    while(i > 0)
	{
        tmpj = j;
        while(tmpj > 0)
		{
            ar[i][tmpj] ^= 1;
            tmpj -= lowbit(tmpj);
        }
        i -= lowbit(i);
    }
}

int query(int i, int j)
{
    int tmpj, ans = 0;
    while(i <= n)
	{
        tmpj = j;
        while(tmpj <= n)
		{
            ans ^= ar[i][tmpj];
            tmpj += lowbit(tmpj);
        }
        i += lowbit(i);
    }
    return ans;
}

int main()
{
    int t, x, xx, y, yy;
    scanf("%d", &t);
    while(t --)
	{
        memset(ar, 0, sizeof(ar));
        scanf("%d%d", &n, &m);
        while(m --)
		{
            char ord;
            cin >> ord;
            if(ord == 'C')
			{
                scanf("%d%d%d%d", &x, &y, &xx, &yy);
                updata(xx, yy);
                updata(x-1, yy);
                updata(xx, y-1);
                updata(x-1, y-1);
            }
			else
			{
                scanf("%d%d", &x, &y);
                printf("%d\n", query(x, y));
            }
        }
        printf("\n");
    }
    return 0;
}

 


 

 

 

分享到:
评论

相关推荐

    2010FZUACM_高级数据结构习题讲解1

    POJ2155 Matrix问题就是一个典型例子,需要巧妙转化问题,将查询一个点转化为更新一个区域。 - **三维树状数组**:可以用来动态求解三维长方体体积,查询复杂度为O(logm * logn * logL)。例如URAL1470 UFOs问题,...

    Poj中的一些题目源代码

    9. **P2155.cpp** - 同上,需要题目描述才能确定讨论的具体算法或数据结构。 从这些文件来看,我们可以看到一些常见的算法主题,如最小生成树、时间复杂度优化和可能的特殊问题变种。学习这些源代码可以帮助理解...

    树状数组题目集

    **题目**:POJ2155是一道涉及二维树状数组的问题,这里简化为一维情况讨论。 - **操作**: 1. 修改区间`(a, b)`内所有元素。 2. 查询点`(a)`的值。 - **解决方案**:通过对树状数组的进一步改造,可以解决此类问题...

    树状数组(Binary Indexed Tree)

    7. **二维树状数组 POJ2155:Matrix** - **题意**:给定一个n*n的矩阵,支持对子矩阵进行翻转操作,并查询特定位置的值。 - **解法**:通过构建二维树状数组来实现对子矩阵的翻转操作,并进行查询。 #### 总结 ...

    树状数组超详解外加大量题解

    考虑一个更复杂的场景,如POJ2155题目,要求实现两种操作:一是更新区间(a, b)内的所有元素;二是查询某个点(a)的值。这种情况下,可以通过构建二维树状数组来解决。二维树状数组的工作原理与一维类似,但在更新和...

    poj pku 解题报告

    1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1011 1012 1013 1014 ...2155 2181 2182 2184 2185 2186 2187 2188 2190 2192 2195 2228 2229 2234 2236 2241 2242 2245 2247 2248 2249 2253 2264 2287 2299 2301 ...

Global site tag (gtag.js) - Google Analytics