[BZOJ1452/Luogu4054][JSOI2009]Count计数问题

题目链接:

BZOJ1452

Luogu4054

二维树状数组题(或许可以毒瘤树套树

注意到值域范围为\(100\),对每个数开一个二维树状数组,在对应的树状数组上修改查询即可。

时间复杂度 \(O(Qlognlogm)\)

空间复杂度 \(O(nmc)\)

代码:

#include <cstdio>

int n,m,q,a[305][305];
struct Binary_Indexed_Tree
{
    int c[305][305];
    
    inline void Modify(int x,int ys,int v)
    {
        for(;x<=n;x+=x&-x)
            for(int y=ys;y<=m;y+=y&-y)
                c[x][y]+=v;
    }
    
    inline int Query(int x,int ys)
    {
        int Res=0;
        for(;x;x^=x&-x)
            for(int y=ys;y;y^=y&-y)
                Res+=c[x][y];
        return Res;
    }
}Bit[105];

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
        {
            scanf("%d",&a[i][j]);
            Bit[a[i][j]].Modify(i,j,1);
        }
    scanf("%d",&q);
    for(int op,x,y,xs,ys,c;q--;)
        if(scanf("%d",&op),op==1)
        {
            scanf("%d%d%d",&x,&y,&c);
            Bit[a[x][y]].Modify(x,y,-1);
            Bit[a[x][y]=c].Modify(x,y,1);
        }
        else
        {
            scanf("%d%d%d%d%d",&x,&xs,&y,&ys,&c);
            int r1=Bit[c].Query(xs,ys);
            int r2=Bit[c].Query(xs,y-1);
            int r3=Bit[c].Query(x-1,ys);
            int r4=Bit[c].Query(x-1,y-1);
            printf("%d\n",r1-r2-r3+r4);
        }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/LanrTabe/p/10450969.html