[BZOJ1452] [JSOI2009]Count

题目描述

Description

Input

Output

Sample Input

Sample Output

1
2

HINT

题目分析:

对于每个颜色 我们都开一个二维树状数组就好了

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
int f[105][305][305];
int n,m;
int a[305][305];
void update(int x,int y,int color,int val)
{
    for(int i=x;i<=n;i+=(i&-i))
        for(int j=y;j<=m;j+=(j&-j))
            f[color][i][j]+=val;
}
int ask(int x,int y,int color)
{
    //if(x==0||y==0) return 0;
    int sum=0;
    for(int i=x;i;i-=(i&-i))
        for(int j=y;j;j-=(j&-j))
            sum+=f[color][i][j];
    return sum;
}
int q;
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]);
            update(i,j,a[i][j],1);
        }
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        int tmp;
        scanf("%d",&tmp);
        if(tmp==1)
        {
            int x,y,c;
            scanf("%d%d%d",&x,&y,&c);
            update(x,y,a[x][y],-1);
            a[x][y]=c;
            update(x,y,a[x][y],1);
        }
        else
        {
            int dx1,dx2,dy1,dy2,c;
            scanf("%d%d%d%d%d",&dx1,&dx2,&dy1,&dy2,&c);
            int ans=0;
            ans=ask(dx2,dy2,c)+ask(dx1-1,dy1-1,c);
            ans-=ask(dx1-1,dy2,c);
            ans-=ask(dx2,dy1-1,c);
            printf("%d\n",ans);
        }
    }
}

发表评论

邮箱地址不会被公开。 必填项已用*标注