一个n*m的方格,初始时每个格子有一个整数权值。接下来每次有2种操作:
改变一个格子的权值;
求一个子矩阵中某种特定权值出现的个数。
标签:代码 结果 sample fine bit str style span amp
3 3
1 2 3
3 2 1
2 1 3
3
2 1 2 1 2 1
1 2 3 2
2 2 3 2 3 2
1
2
对于30%的数据n,m<=30,q<=10000
对于100%的数据 n,m<=300,q<=100000,1<=c<=100
#include <iostream> #include<cstdio> #define lowbit(x) x&(-x) using namespace std; int n,m; int Map[310][310]; int c[310][310][110]; void add(int x,int y,int k,int val){ for(int i=x;i<=n;i+=lowbit(i)){ for(int j=y;j<=m;j+=lowbit(j)){ c[i][j][k]+=val; } } } int getsum(int x,int y,int k){ int ret=0; for(int i=x;i>0;i-=lowbit(i)){ for(int j=y;j>0;j-=lowbit(j)){ ret+=c[i][j][k]; } } return ret; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%d",&Map[i][j]); add(i,j,Map[i][j],1); } } int q; scanf("%d",&q); while(q--){ int op; scanf("%d",&op); if(op==1){ int x,y,k; scanf("%d%d%d",&x,&y,&k); add(x,y,Map[x][y],-1); add(x,y,k,1); Map[x][y]=k; } if(op==2){ int x,xx,y,yy,k; scanf("%d%d%d%d%d",&x,&xx,&y,&yy,&k); printf("%d\n",getsum(xx,yy,k)-getsum(x-1,yy,k)-getsum(xx,y-1,k)+getsum(x-1,y-1,k)); } } return 0; }
标签:代码 结果 sample fine bit str style span amp
原文地址:https://www.cnblogs.com/lllxq/p/9095555.html