Matrix PKU 2155

问题描述
给定N * N矩阵A,其元素为0或1.A [i,j]表示第i行和第j列中的数字。最初我们有A [i,j] = 0(1 <= i,j <= N)。 

我们可以通过以下方式更改矩阵。给定一个左上角为(x1,y1)且右下角为(x2,y2)的矩形,我们使用“not”操作更改矩形中的所有元素(如果是'0'则更改它变为'1'否则将其变为'0')。要维护矩阵的信息,系统会要求您编写程序以接收和执行两种指令。 

1. C x1 y1 x2 y2(1 <= x1 <= x2 <= n,1 <= y1 <= y2 <= n)通过使用左上角为(x1,y1)和更低的矩形来改变矩阵 - 右角是(x2,y2)。 
2. Q xy(1 <= x, 
 
输入
输入的第一行是整数X(X <= 10),表示测试用例的数量。以下X块表示测试用例。<br> <br>每个块的第一行包含两个数字N和T(2 <= N <= 1000,1 <= T <= 50000),表示矩阵的大小和指令的数量。以下T行各自表示具有格式“Q x y”或“C x1 y1 x2 y2”的指令,其已在上面描述。点击
 
产量
对于每个查询输出一行,其具有表示A [x,y]的整数。<br> <br>每两个连续测试用例之间有一个空行。点击
 
样本输入
1 2 10 C 2 1 2 2 问2 2 C 2 1 2 1 问1 1 C 1 1 2 1 C 1 2 1 2 C 1 1 2 2 问1 1 C 1 1 2 1 问题2 1
 
样本输出
1 0 0 1
 
 
采用树状数组的区域修改单点查询
注意一下细节   sum是自上而下  大于0    update是自下而上 小于等于N的!
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int N;
int c[1005][1005];

int lowbit(int i)
{
    return i&-i;
}
void update(int x,int y,int v)
{
    for(int i=x;i<=N;i+=lowbit(i))
        for(int j=y;j<=N;j+=lowbit(j))
        c[i][j]+=v;
}
int sum(int x,int y)
{
    int ans=0;
    for(int i=x;i>0;i-=lowbit(i))
        for(int j=y;j>0;j-=lowbit(j))
        ans+=c[i][j];
    return ans;
}
int main()
{
        int cas,q;
        scanf("%d",&cas);
        int first=1;
        for(int i=1;i<=cas;i++)
        {
            if(i!=1)printf("\n");
            scanf("%d%d",&N,&q);
            memset(c,0,sizeof(c));
            char s[5];
            int x1,x2,y1,y2;
            while(q--)
            {
                scanf("%s",s);
                if(s[0]=='C')
                {
                    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                    update(x1,y1,1);
                    update(x2+1,y1,-1);
                    update(x1,y2+1,-1);
                    update(x2+1,y2+1,1);
                }
                else if(s[0]=='Q')
                {
                    scanf("%d%d",&x1,&y1);
                    printf("%d\n",sum(x1,y1)%2);
                }
            }
        }
        return 0;
}

 

 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/bxd123/p/10358455.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值