前言
思路
题目要求,单点修改,并且区间求和,显然我们可以联想到树状数组
因此我们可以使用 t r [ i ] [ j ] [ k ] tr[i][j][k] tr[i][j][k]来记录,一个坐标上的状态
剩下的就和一维树状数组差不多了,不多做解释
Mycode
const int N = 310;
int tr[N][N][110];
int a[N][N];
int n,m;
int lowbit(int x){
return x & -x;
}
void add(int x,int y,int color,int k){
for(int i = x; i<N; i +=lowbit(i))
for(int j=y;j<N;j +=lowbit(j)){
tr[i][j][color]+=k;
}
}
int query(int x,int y,int color){
int ans = 0 ;
for(int i=x;i;i-=lowbit(i)){
for(int j=y;j;j-=lowbit(j))
ans+=tr[i][j][color];
}
return ans;
}
void solve()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>a[i][j];
add(i,j,a[i][j],1);
}
int q;cin>>q;
for(int i=1;i<=q;i++){
char op[2];cin>>op;
if(*op == '2'){
int x1,y1,x2,y2,c;cin>>x1>>x2>>y1>>y2>>c;
cout<<query(x2,y2,c) - query(x1-1,y2,c) - query(x2,y1-1,c) + query(x1-1,y1-1,c)<<endl;
}else{
int x,y,k;cin>>x>>y>>k;
add(x,y,a[x][y],-1);
a[x][y] = k;
add(x,y,a[x][y],1);
}
}
}