zoukankan      html  css  js  c++  java
  • poj 2155 Matrix (二维树状数组)

            这是楼教主出的二维线段树或者是二维树状数组的题,题意很简单,就是有个n*n的矩阵,初始值都是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
    ", 1);
                    else
                        printf("%d
    ", 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;
    }
    



  • 相关阅读:
    NanoHTTPD服务
    Pattern、Matcher的用法
    浅析protobuf应用
    Socket通信,基本方法介绍
    String常用处理方法
    什么是重做日志?
    控制文件数据字典视图
    删除控制文件
    使用当前副本恢复控制文件
    备份控制文件
  • 原文地址:https://www.cnblogs.com/xindoo/p/3595045.html
Copyright © 2011-2022 走看看