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; }