一个N*M的方格,初始时每个格子有一个整数权值,接下来每次有2个操作:
改变一个格子的权值
求一个子矩阵中某个特定权值出现的个数
标签:i++ count 改变 else ret 整数 特定 ++ output
对于每个操作2,按输入中出现的顺序,依次输出一行一个整数表示所求得的个数
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 int n,m,q; 7 int mp[305][305]; 8 int t[105][305][305]; 9 10 int lowbit(int x){return x&(-x);} 11 void update(int x,int y,int c,int v) 12 { 13 for(int i=x;i<=n;i+=lowbit(i)) 14 for(int j=y;j<=m;j+=lowbit(j)) 15 t[c][i][j]+=v; 16 } 17 18 int ask(int x,int y,int c) 19 { 20 int tmp=0; 21 for(int i=x;i;i-=lowbit(i)) 22 for(int j=y;j;j-=lowbit(j)) 23 tmp+=t[c][i][j]; 24 return tmp; 25 } 26 27 int main() 28 { 29 scanf("%d%d",&n,&m); 30 for(int i=1;i<=n;i++) 31 for(int j=1;j<=m;j++) 32 { 33 scanf("%d",&mp[i][j]); 34 update(i,j,mp[i][j],1); 35 } 36 scanf("%d",&q); 37 while(q--) 38 { 39 int f; 40 scanf("%d",&f); 41 int x1,y1,x2,y2,c; 42 if(f==1) 43 { 44 scanf("%d%d%d",&x1,&y1,&c); 45 update(x1,y1,mp[x1][y1],-1); 46 mp[x1][y1]=c; 47 update(x1,y1,mp[x1][y1],1); 48 } 49 else 50 { 51 scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c); 52 int ans=ask(x1-1,y1-1,c)+ask(x2,y2,c)-ask(x1-1,y2,c)-ask(x2,y1-1,c); 53 printf("%d\n",ans); 54 } 55 } 56 return 0; 57 }
标签:i++ count 改变 else ret 整数 特定 ++ output
原文地址:https://www.cnblogs.com/InWILL/p/9740741.html