zoukankan      html  css  js  c++  java
  • 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("
    ");
                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
    ",sum(x1,y1)%2);
                    }
                }
            }
            return 0;
    }
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    P1121 环状最大两段子段和
    无题
    cdoj 1485 柱爷搞子串 sam treap
    自然数幂和
    Gym 100341C AVL Trees NTT
    线性筛分解质因子
    codeforces 366 Ant Man dp
    UVALive 6914 Maze Mayhem 轮廓线dp
    hdu 5790 Prefix 字典树 主席树
    莫比乌斯反演个人小结
  • 原文地址:https://www.cnblogs.com/bxd123/p/10358455.html
Copyright © 2011-2022 走看看