bzoj1452: [JSOI2009]Count

2维bit。每个颜色建一个。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 300+10;

struct Bit2D {
    int a[maxn][maxn],n,m;
    inline int lowbit(int x) {
        return x&-x;
    }
    
    void add(int x,int y,int d) {
        for(int i=x;i<=n;i+=lowbit(i))
        for(int j=y;j<=m;j+=lowbit(j))
            a[i][j]+=d;
    }
    
    int query(int x,int y) {
        int res =0;
        for(int i=x;i;i-=lowbit(i))
        for(int j=y;j;j-=lowbit(j)) 
            res+=a[i][j];
        return res;
    }
    
    int query2(int x1,int x2,int y1,int y2) {
        int res=query(x2,y2)+query(x1-1,y1-1)-query(x1-1,y2)-query(x2,y1-1);
        return res;
    }
    
    void build(int a,int b) {
        n=a; m=b;
    }
} bit[110];

int a[maxn][maxn];

void op1() {
    int x,y,c;
    scanf("%d%d%d",&x,&y,&c);
    bit[a[x][y]].add(x,y,-1);
    bit[c].add(x,y,1);
    a[x][y]=c;
}

void op2() {
    int x1,x2,y1,y2,c;
    scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c);
    printf("%d\n",bit[c].query2(x1,x2,y1,y2));
}

int main() {
  int n,m,q;
  scanf("%d%d",&n,&m);
  for(int i=1;i<=100;i++) bit[i].build(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]].add(i,j,1);
  }
  scanf("%d",&q);
  for(int i=1,op;i<=q;i++) {
      scanf("%d",&op);
      if(op==1) op1();
      else op2();
  }
  return 0;
}
posted @ 2016-04-25 22:56  invoid  阅读(169)  评论(0编辑  收藏  举报