`

poj 2155 Martrix(二维树状数组)

阅读更多
Matrix
Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 10282   Accepted: 3859

Description

Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1 <= i, j <= N).

We can change the matrix in the following way. Given a rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2), we change all the elements in the rectangle by using "not" operation (if it is a '0' then change it into '1' otherwise change it into '0'). To maintain the information of the matrix, you are asked to write a program to receive and execute two kinds of instructions.

1. C x1 y1 x2 y2 (1 <= x1 <= x2 <= n, 1 <= y1 <= y2 <= n) changes the matrix by using the rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2).
2. Q x y (1 <= x, y <= n) querys A[x, y].

Input

The first line of the input is an integer X (X <= 10) representing the number of test cases. The following X blocks each represents a test case.

The first line of each block contains two numbers N and T (2 <= N <= 1000, 1 <= T <= 50000) representing the size of the matrix and the number of the instructions. The following T lines each represents an instruction having the format "Q x y" or "C x1 y1 x2 y2", which has been described above.

Output

For each querying output one line, which has an integer representing A[x, y].

There is a blank line between every two continuous test cases.

Sample Input

1
2 10
C 2 1 2 2
Q 2 2
C 2 1 2 1
Q 1 1
C 1 1 2 1
C 1 2 1 2
C 1 1 2 2
Q 1 1
C 1 1 2 1
Q 2 1

Sample Output

1
0
0
1

  

          此题大意:给你一个2维平面,C:(X1,Y1)(X2,Y2)就是将这里范围的点改变:0->1、1->0,Q:(x,y)就是问这个点是什么。

      典型的二维树状数组,就是增加一维,写法和一维基本一致,不多说,看下面的吧!!!

链接:http://poj.org/problem?id=2155

代码:

#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;

int a[1005][1005], n;

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

void update(int i, int j, int x)    //二维树状数组更新
{
    int tj;
    while(i <= n)
    {
        tj = j;
        while(tj <= n)
        {
            a[i][tj] += x;
            tj += lowbit(tj);
        }
        i += lowbit(i);
    }
}

int sum(int i, int j)   //二维树状数组求和
{
    int tj, sum = 0;
    while(i > 0)
    {
        tj = j;
        while(tj > 0)
        {
            sum += a[i][tj];
            tj -= lowbit(tj);
        }
        i -= lowbit(i);
    }
    return sum;
}

int main()
{
    int T, i, j, t, x1, y1, x2, y2;
    char ch[2];
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d %d", &n, &t);
        for(i = 1; i <= n; i++)
            for(j = 1; j <= n; j++)
                a[i][j] = 0;
        while(t--)
        {
            scanf("%s", ch);
            if(ch[0] == 'C')
            {
                scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
                //更新区域-容斥原理
                update(x2+1, y2+1, 1);
                update(x2+1, y1, 1);
                update(x1, y2+1, 1);
                update(x1, y1, 1);
            }
            if(ch[0] == 'Q')
            {
                scanf("%d %d", &x1, &y1);
                printf("%d\n", sum(x1, y1)&1);  //该点的值就是sum(x,y)
            }
        }
        printf("\n");
    }

    return 0;
}

 

 

 

 

0
5
分享到:
评论

相关推荐

    二维树状数组学习之二:练习POJ 1195

    在本篇中,我们将深入学习二维树状数组的应用,并通过解决POJ 1195问题来实践这一概念。 POJ 1195题目要求我们计算一个二维矩阵中的子矩阵之和。这正是二维树状数组的优势所在,因为我们可以快速地对矩阵的任意矩形...

    二维树状数组练习 POJ 2029

    它扩展了一维树状数组(也称作线段树),能够处理二维或多维的数组更新和查询操作。在POJ 2029这个题目中,我们可能面临的问题是需要对一个二维矩阵进行动态更新和求和查询,例如计算某一个矩形区域内的元素总和。 ...

    树状数组练习:POJ 2481(JAVA)

    【标题】"树状数组练习:POJ 2481(JAVA)" 是一篇关于使用树状数组(也称为线段树)解决编程竞赛问题的文章。这篇文章可能详细讲解了如何运用这种数据结构来解决特定的问题POJ 2481。POJ(Programming Online Judge)...

    树状数组练习:POJ 3067

    树状数组的核心思想是将一维数组映射到一棵完全二叉树上,每个节点存储对应子数组的累加和。对于任意索引i,其对应的树状数组节点存储了索引[i, 2i)(左闭右开)区间的元素和。这样,我们可以通过一系列的“更新”和...

    poj 2352 stars(树状数组,线段树)

    ### POJ 2352 Stars - 树状数组与线段树实现 #### 题目背景 POJ 2352 Stars 是一道经典的算法题目,它提供了使用树状数组或线段树来解决的可能性。这两种数据结构都是为了高效处理区间查询问题而设计的。在这篇...

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

    二维树状数组的工作原理与一维类似,但在更新和查询时需要在两个维度上分别执行`Update`和`Getsum`操作。 #### 七、总结 树状数组是一种强大的数据结构,尤其适用于区间查询和单点更新问题。通过灵活运用`Update`...

    树状数组题目集

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

    树状数组题解1

    这是一个二维矩阵的操作问题,树状数组在这里扩展到了二维,称为二维树状数组或棋盘树。同样,它支持区间查询和修改。对于矩阵中的每个元素,可以通过二维树状数组在常数时间内完成子矩阵的求和操作,从而高效地处理...

    图的深搜+树状数组练习 POJ 3321(JAVA)

    标题中的“图的深搜+树状数组练习 POJ 3321(JAVA)”指的是一个编程题目,其中涉及到图的深度优先搜索(DFS, Depth First Search)算法和树状数组(也称为线段树,Segment Tree)的数据结构。这个题目来源于POJ...

    树状数组(Binary Indexed Tree)

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

    ACM数据结构之树状数组和线段树

    ### ACM数据结构之树状数组和线段树 #### 线段树 线段树是一种非常有效的数据结构,主要用于解决区间查询问题。它能够快速地处理区间内的各种操作,如查询、修改等。 ##### 线段树的定义与特性 线段树本质上是一...

    poj1990.rar_POJ 19_poj_poj19

    《POJ 1990:树状数组解题策略详解》 在编程竞赛的世界里,POJ(Programming Online Judge)是一个备受瞩目的在线评测系统,它提供了丰富的编程题目供参赛者挑战。其中,编号为1990的题目是一道涉及数据结构与算法...

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

    以上就是高级数据结构习题讲解中的核心知识点,包括树状数组、二维和三维树状数组的使用,线段树在处理区间问题上的应用,动态规划和并查集在特定问题中的策略。理解并掌握这些工具和方法,有助于解决复杂的算法竞赛...

    POJ3468.zip_poj3468

    树状数组的核心思想是将一个一维数组转化为一棵完全二叉树,但不同于普通的二叉树,它的节点存储的是子数组的累加值。这样,我们可以通过二分查找的方式快速定位到某个区间的累加和,或者在某个位置插入或删除元素时...

    ACMer需要掌握的算法讲解.docx

    3. 最小树形图(poj3164) 4. 次小生成树 5. 无向图、有向图的最小环 三、数据结构 1. RMQ(poj3264, poj3368) 2. 并查集的高级应用(poj1703, poj2492) 3. KMP 算法(poj1961, poj2406) 4. 左偏树(可合并堆)...

    滚动数组应用:POJ 1159

    标题“滚动数组应用:POJ 1159”指的是一个关于编程竞赛问题的解决方案,该问题在POJ(Programming Online Judge)平台上被提出。滚动数组是一种优化动态规划算法的技术,通过巧妙地重用和更新已经计算过的状态,减少...

    poj_2682(3).rar_C++ 数组扩充_poj 26_poj 2682_poj26

    "C++ 数组扩充"提示我们问题可能与如何在C++编程语言中处理数组的增长有关,而"poj 26_poj 2682_poj26"似乎是重复提及问题编号,可能是用户在整理文件时的习惯。 描述中提到的“数链思想”可能是指一种处理数组元素...

    POJ1163-The Triangle

    2. **二维数组处理**:题目可能会给出一个表示三角形的二维数组,每行的元素代表三角形的一层,每个元素的值代表该位置的权重。程序需要处理这个二维数组,找到最佳路径。 3. **递推公式**:动态规划的核心是建立...

    经典 的POJ 分类

    - POJ 3264、POJ 3368:树状数组的构造与更新。 #### 字符串匹配 - **题目示例**: - POJ 1961、POJ 2406:KMP算法的应用。 ### 其他问题 #### 贪心算法 - **题目示例**: - POJ 3411、POJ 1724:贪心策略的...

    史上最全poj题目分类

    树状数组是一种常用的数据结构,树状数组的核心思想是将数据存储在一个树形结构中,然后通过树的遍历进行搜索。例如,在搜索中,树状数组可以用于快速地搜索数据。 数学 数论是一种常用的数学思想,数论的核心思想...

Global site tag (gtag.js) - Google Analytics