POJ 2155 Matrix(二维树状数组)

转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove

因为线段树常数有点大,而且编程复杂度高,所以简单入手一下树状数组。

传说中的男人八题。

普通的二维树状数组操作。

对于点更新,或者点查询,则一直往树根拓展

如果是区间常数或者区间更新的,则一直往叶子拓展

#include<iostream>  
#include<cstdio>  
#include<map>  
#include<cstring>  
#include<cmath>  
#include<vector>  
#include<algorithm>  
#include<set>  
#include<string>  
#include<queue>  
#define inf 1600005  
#define M 40  
#define N 70005
#define maxn 300005  
#define eps 1e-7
#define zero(a) fabs(a)<eps  
#define Min(a,b) ((a)<(b)?(a):(b))  
#define Max(a,b) ((a)>(b)?(a):(b))  
#define pb(a) push_back(a)  
#define mp(a,b) make_pair(a,b)  
#define mem(a,b) memset(a,b,sizeof(a))  
#define LL long long  
#define MOD 2012  
#define lson step<<1
#define rson step<<1|1
#define sqr(a) ((a)*(a))  
#define Key_value ch[ch[root][1]][0]  
#define test puts("OK");  
#define pi acos(-1.0)
#define lowbit(x) ((x)&(-(x)))
#pragma comment(linker, "/STACK:1024000000,1024000000")  
using namespace std;  
int x,y,xx,yy;
int n,q;
int s[1005][1005];
void Update(int x,int y){
    for(int i=x;i>0;i-=lowbit(i))
        for(int j=y;j>0;j-=lowbit(j))
            s[i][j]^=1;
}
int sum(int x,int y){
    int ret=0;
    for(int i=x;i<=n;i+=lowbit(i))
        for(int j=y;j<=n;j+=lowbit(j))
            ret^=s[i][j];
    return ret;
}
int main(){
    //freopen("in.in","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&q);
        mem(s,0);
        while(q--){
            char str[5];
            scanf("%s",str);
            if(str[0]=='C'){
                scanf("%d%d%d%d",&x,&y,&xx,&yy);
                Update(xx,yy);
                Update(x-1,yy);
                Update(xx,y-1);
                Update(x-1,y-1);
            }
            else{
                scanf("%d%d",&x,&y);
                printf("%d\n",sum(x,y));
            }
        }
        if(t) puts("");
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值