poj 2155 Matrix (二维树状数组)

简介: 这是楼教主出的二维线段树或者是二维树状数组的题,题意很简单,就是有个n*n的矩阵,初始值都是0,然后给你两个操作,一个是给你左上角和右下角的坐标,把这个长方形的区间所有元素反取反(0变1 1变0),另一个是求某个具体坐标的值。 这里我用了二维的线树状数组,一维树状数组可以解决区间更新和点查询的问题,这里只需要加一维就可以了,代码比较好写,不过开始犯了很多低级的错误。

这是楼教主出的二维线段树或者是二维树状数组的题,题意很简单,就是有个n*n的矩阵,初始值都是0,然后给你两个操作,一个是给你左上角和右下角的坐标,把这个长方形的区间所有元素反取反(0变1 1变0),另一个是求某个具体坐标的值。


      这里我用了二维的线树状数组,一维树状数组可以解决区间更新和点查询的问题,这里只需要加一维就可以了,代码比较好写,不过开始犯了很多低级的错误。

//============================================================================
// Name        : 2012083101.cpp
// Author      : xindoo
// Version     :
// Copyright   : Your copyright notice
// Description : poj 2155
// Data        : 2013-08-29-17.06
//============================================================================
#include <stdio.h>
#include <string.h>
const int maxn = 1004;
int xy[maxn][maxn];
int n;
inline int lowbit(int x)
{
    return x&-x;
}
void update(int x, int y, int v)
{
  int t = y;
    while (x <= n)
    {
      y = t;
        while (y <= n)
        {
            xy[x][y] += v;
            y += lowbit(y);
        }
        x += lowbit(x);
    }
}
int getsum(int x, int y)
{
    int sum = 0;
    int t = y;
    while (x)
    {
      y = t;
        while (y)
        {
            sum += xy[x][y];
            y -= lowbit(y);
        }
        x -= lowbit(x);
    }
    return sum;
}
int main()
{
    int q, kase;
    char op;
    int x1, x2, y1, y2;
    scanf("%d", &kase);
    while (kase--)
    {
        scanf("%d %d", &n, &q);
        memset(xy, 0, sizeof(xy));
        while (q--)
        {
            getchar();
            scanf("%c", &op);
            if (op == 'Q')
            {
                scanf("%d %d", &x1, &y1);
                int t = getsum(x1, y1);
                if (t&1)
                    printf("%d\n", 1);
                else
                    printf("%d\n", 0);
            }
            else
            {
                scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
                update(x1, y1, 1);
                update(x1, y2+1, -1);
                update(x2+1, y1, -1);
                update(x2+1, y2+1, 1);
            }
        }
        if (kase)
            puts("");
    }
    return 0;
}
目录
相关文章
|
4月前
|
前端开发 API 定位技术
如何开发车辆管理系统中的用车申请板块(附架构图+流程图+代码参考)
本文详细解析了如何将传统纸质车辆管理流程数字化,涵盖业务规则、审批流、调度决策及数据留痕等核心环节。内容包括用车申请模块的价值定位、系统架构设计、数据模型构建、前端表单实现及后端开发技巧,助力企业打造可落地、易扩展的车辆管理系统。
|
IDE Java 开发工具
python缩进错误(IndentationError)
【7月更文挑战第12天】
2708 10
|
机器学习/深度学习 人工智能 数据可视化
10个用于可解释AI的Python库
10个用于可解释AI的Python库
284 0
|
负载均衡 安全 网络架构
|
机器学习/深度学习 人工智能 算法
AI - 集成学习
集成学习是一种机器学习策略,它通过组合多个模型(称为基学习器)来创建一个更强大、更稳健的预测模型。基学习器可以是不同类型或同类型的模型,如决策树、SVM、神经网络等。
|
移动开发 网络协议 安全
一篇文章带你搞懂TCP/IP协议与OSI七层网络模型
一篇文章带你搞懂TCP/IP协议与OSI七层网络模型
826 0
一篇文章带你搞懂TCP/IP协议与OSI七层网络模型
|
存储 Java
Java中的逻辑运算符详解
Java中的逻辑运算符详解
583 0
|
机器学习/深度学习 人工智能 搜索推荐
【边做边学】大语言模型(LLM)
【边做边学】大语言模型(LLM)
445 0
|
移动开发 小程序 JavaScript
小程序第三方框架对比 (mpvue、wepy、taro)1
小程序第三方框架对比 (mpvue、wepy、taro)
|
存储 算法 Linux
一个供参考的计算机的学习路线
写给大一新生的计算机学习路线,供批判性参考
843 0
一个供参考的计算机的学习路线