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;
    }
    



  • 相关阅读:
    开源数据库
    深度学习TensorFlow笔记——学习率
    深度学习TensorFlow笔记——损失函数
    深度学习TensorFlow笔记
    Oracle常用内置函数
    Oracle数据库自带表或者视图
    Oracle数据库查询所有关键字
    IP代理网址
    时间、日历(time、calendar、datatime)
    selenium常用操作
  • 原文地址:https://www.cnblogs.com/xindoo/p/3595045.html
Copyright © 2011-2022 走看看