码迷,mamicode.com
首页 > 编程语言 > 详细

POJ-2155-Matrix二位树状数组应用

时间:2018-02-03 16:13:11      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:题目   pre   string   div   一个   return   apr   add   blank   

题目:一个只有0和1构成的二维平面,给你两种指令,一种是区间的更新,即0变为1,1变为0;一种是查询一个点是1还是0;

由于是二进制,所以每次更新在相应的点上加一,最后对2取余即可。

至于二维的树状数组的应用原理,我也是看了这篇论文才明白;

国家队论文集/2009/武森《浅谈信息学竞赛中的“0”和“1”》

我就在补充一下AC代码;

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>

typedef long long LL;

using namespace std;

int T,M,n,c[1010][1010];
char str[20];

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

void add(LL a,LL b,LL cont)
{
    for(int i=a;i<=n;i+=lowbit(i))
    {
        for(int j=b;j<=n;j+=lowbit(j))
        {
            c[i][j]+=cont;
        }
    }
}

LL getsum(LL a,LL b)
{
    LL sum=0;
    for(LL i = a;i>0;i-=lowbit(i))
    {
        for(LL j = b;j>0;j-=lowbit(j))
        {
            sum+=c[i][j];
        }
    }
    return sum;
}

int main(){
    scanf("%d",&T);
    while(T--)
    {

        scanf("%d%d",&n,&M);
        memset(c,0,sizeof(c));
        for(int i=1;i<=M;i++)
        {
            scanf("%s",str);
            if(str[0]==C)
            {
                LL x1,y1,x2,y2;
                scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
                add(x1,y1,1);            //分别对二维四个点进行更新
                add(x1,y2+1,1);
                add(x2+1,y1,1);
                add(x2+1,y2+1,1);    
            }
            else if(str[0]==Q)
            {
                LL x,y;
                scanf("%lld%lld",&x,&y);
                printf("%lld\n",getsum(x,y)%2);
            }
        }
        if(T!=0)printf("\n");
    }

    return 0;
}

 

POJ-2155-Matrix二位树状数组应用

标签:题目   pre   string   div   一个   return   apr   add   blank   

原文地址:https://www.cnblogs.com/ckxkexing/p/8408702.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!