首页 > 代码库 > 【二维树状数组】bzoj1452 [JSOI2009]Count

【二维树状数组】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           else41             {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 }

【二维树状数组】bzoj1452 [JSOI2009]Count