首页 > 代码库 > 【二维树状数组】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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。