【二维树状数组】bzoj1452 [JSOI2009]Count
权值的种类只有100种,对每种开个二维BIT,然后是经典操作。
1 #include<cstdio> 2 using namespace std; 3 int n,m,q,x1,y1,x2,y2,val,op,a[301][301]; 4 struct BIT_2D 5 { 6 int d[301][301]; 7 void update(int x,const int &y,const int &V) 8 { 9 for(;x<=n;x+=(x&(-x))) 10 for(int j=y;j<=n;j+=(j&(-j))) 11 d[x][j]+=V; 12 } 13 int getsum(int x,const int &y) 14 { 15 int res=0; 16 for(;x;x-=(x&(-x))) 17 for(int j=y;j;j-=(j&(-j))) 18 res+=d[x][j]; 19 return res; 20 } 21 }T[101]; 22 int main() 23 { 24 scanf("%d%d",&n,&m); 25 for(int i=1;i<=n;++i) 26 for(int j=1;j<=m;++j) 27 { 28 scanf("%d",&a[i][j]); 29 T[a[i][j]].update(i,j,1); 30 } scanf("%d",&q); 31 for(;q>0;--q) 32 { 33 scanf("%d",&op); 34 if(op==1) 35 { 36 scanf("%d%d%d",&x1,&y1,&val); 37 T[a[x1][y1]].update(x1,y1,-1); 38 T[a[x1][y1]=val].update(x1,y1,1); 39 } 40 else 41 { 42 scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&val); 43 int t1=T[val].getsum(x2,y2); 44 int t2=T[val].getsum(x1-1,y2); 45 int t3=T[val].getsum(x2,y1-1); 46 int t4=T[val].getsum(x1-1,y1-1); 47 printf("%d\n",t1-t2-t3+t4); 48 } 49 } 50 return 0; 51 }
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/