POJ 2155 Matrix

来源:互联网 发布:linux查看所有用户权限 编辑:程序博客网 时间:2024/06/04 18:31

题目链接:http://poj.org/problem?id=2155


题意:给一个二维矩阵,每次一个操作,将一个矩形范围内的值改变一次,或者查询一个点的值。


思路:二维树状数组模板题。


树状数组专题链接:http://blog.csdn.net/chy20142109/article/details/50673749


#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;#define rep(i,j,k) for(int i = j;i<=k;i++)#define Rrep(i,j,k) for(int i = j;i>=k;i--)#define Clean(x,y) memset(x,y,sizeof(x))const int maxn = 1009;int T,X;int n;int sum[maxn][maxn];int lowbit(int x){    return x&(-x);}void add(int x,int y){    while( x <= n )    {        int ty = y;        while( ty <= n )        {            sum[x][ty]+=1;            ty+=lowbit(ty);        }        x+=lowbit(x);    }}int query(int x,int y){    int ans = 0;    while( x )    {        int ty = y;        while(ty)        {            ans+=sum[x][ty];            ty-=lowbit(ty);        }        x-=lowbit(x);    }    return ans;}int main(){    cin>>X;    while(X--)    {        int x1,x2,y1,y2;        char op;        cin>>n>>T;        Clean(sum,0);        while(T--)        {            getchar();            op = getchar();            scanf("%d%d",&x1,&y1);            if ( op == 'C' )            {                scanf("%d%d",&x2,&y2);                add(x1,y1);                add(x2+1,y1);                add(x1,y2+1);                add(x2+1,y2+1);            }            else printf( "%d\n", ( query(x1,y1) )&1 );        }        if ( X ) puts("");    }    return 0;}


0 0
原创粉丝点击