zoukankan      html  css  js  c++  java
  • BZOJ1452: [JSOI2009]Count

    【传送门:BZOJ1452


    简要题意:

      给出一个n*m的矩阵,共有两种操作:

      1 x y c将第x行第y列的数改为c

      2 x1 x2 y1 y2 c求出第x1行第y1列到第x2行第y2列值为c的格子数


    题解:

      第一次写二维树状数组,和一维差不多

      a[x][y][c]表示第1行第1列到第x行第y列值为c的格子数

      然后维护树状数组,求值时,要用矩阵的思想来求


    参考代码:

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int a[310][310][110];
    int n,m;
    int lowbit(int x){return x&-x;}
    void change(int x,int y,int c,int d)
    {
        int t=y;
        while(x<=n)
        {
            y=t;
            while(y<=m)
            {
                a[x][y][c]+=d;
                y+=lowbit(y);
            }
            x+=lowbit(x);
        }
    }
    int getsum(int x,int y,int c)
    {
        int ans=0,t=y;
        while(x!=0)
        {
            y=t;
            while(y!=0)
            {
                ans+=a[x][y][c];
                y-=lowbit(y);
            }
            x-=lowbit(x);
        }
        return ans;
    }
    int map[310][310];
    int main()
    {
        scanf("%d%d",&n,&m);
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&map[i][j]);
                change(i,j,map[i][j],1);
            }
        }
        int q;
        scanf("%d",&q);
        while(q--)
        {
            int t;
            scanf("%d",&t);
            if(t==1)
            {
                int x,y,c;
                scanf("%d%d%d",&x,&y,&c);
                change(x,y,map[x][y],-1);
                map[x][y]=c;
                change(x,y,c,1);
            }
            else
            {
                int x1,x2,y1,y2,c;
                scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c);
                printf("%d
    ",getsum(x2,y2,c)-getsum(x1-1,y2,c)-getsum(x2,y1-1,c)+getsum(x1-1,y1-1,c));
            }
        }
        return 0;
    }

     

  • 相关阅读:
    java(5)流程控制n阶乘各位和
    java(4)运算符
    java(3)
    java(2)
    java(1)
    语音识别,图片识别(1)
    java实现——005从尾到头打印链表
    java实现——004替换空格
    java实现——003二维数组中的查找
    java实现——035第一个只出现一次的字符
  • 原文地址:https://www.cnblogs.com/Never-mind/p/8621365.html
Copyright © 2011-2022 走看看