bzoj1452 [JSOI2009]Count
其实就是二维树状数组模板。
只不过要对每一种颜色开一个二维树状数组。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<string> 5 #include<cstring> 6 #include<cmath> 7 #include<algorithm> 8 #include<ctime> 9 #include<queue> 10 #include<stack> 11 #include<map> 12 #define lowbit(x) x&-x 13 using namespace std; 14 int n,m,h[333][333]; 15 struct shuzu 16 { 17 int aa[333][333]; 18 void add(const int &a,const int &b,const int &x) 19 { 20 for(int i=a;i<=n;i+=lowbit(i)) 21 for(int j=b;j<=m;j+=lowbit(j)) 22 aa[i][j]+=x; 23 } 24 int query(const int &a,const int &b) 25 { 26 int ret=0; 27 for(int i=a;i;i-=lowbit(i)) 28 for(int j=b;j;j-=lowbit(j)) 29 ret+=aa[i][j]; 30 return ret; 31 } 32 }bb[111]; 33 int getint() 34 { 35 int ret=0; 36 char ch=getchar(); 37 while(ch<'0'||ch>'9')ch=getchar(); 38 while(ch>='0'&&ch<='9')ret*=10,ret+=ch-'0',ch=getchar(); 39 return ret; 40 } 41 int main() 42 { 43 n=getint(),m=getint(); 44 for(int i=1;i<=n;i++) 45 for(int j=1;j<=m;j++) 46 { 47 h[i][j]=getint(); 48 bb[h[i][j]].add(i,j,1); 49 } 50 int q; 51 q=getint(); 52 for(int i=1;i<=q;i++) 53 { 54 int op,q,w,e,r,t; 55 op=getint(); 56 if(op==1) 57 { 58 q=getint(),w=getint(),e=getint(); 59 bb[h[q][w]].add(q,w,-1); 60 h[q][w]=e; 61 bb[e].add(q,w,1); 62 } 63 else 64 { 65 q=getint(),e=getint(),w=getint(),r=getint(),t=getint(); 66 int ret=bb[t].query(e,r)-bb[t].query(q-1,r)-bb[t].query(e,w-1)+bb[t].query(q-1,w-1); 67 printf("%d\n",ret); 68 } 69 } 70 return 0; 71 }