[BZOJ1452/Luogu4054][JSOI2009]Count计数问题
题目链接:
二维树状数组题(或许可以毒瘤树套树)
注意到值域范围为\(100\),对每个数开一个二维树状数组,在对应的树状数组上修改查询即可。
时间复杂度 \(O(Qlognlogm)\)
空间复杂度 \(O(nmc)\)
代码:
#include <cstdio>
int n,m,q,a[305][305];
struct Binary_Indexed_Tree
{
int c[305][305];
inline void Modify(int x,int ys,int v)
{
for(;x<=n;x+=x&-x)
for(int y=ys;y<=m;y+=y&-y)
c[x][y]+=v;
}
inline int Query(int x,int ys)
{
int Res=0;
for(;x;x^=x&-x)
for(int y=ys;y;y^=y&-y)
Res+=c[x][y];
return Res;
}
}Bit[105];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
scanf("%d",&a[i][j]);
Bit[a[i][j]].Modify(i,j,1);
}
scanf("%d",&q);
for(int op,x,y,xs,ys,c;q--;)
if(scanf("%d",&op),op==1)
{
scanf("%d%d%d",&x,&y,&c);
Bit[a[x][y]].Modify(x,y,-1);
Bit[a[x][y]=c].Modify(x,y,1);
}
else
{
scanf("%d%d%d%d%d",&x,&xs,&y,&ys,&c);
int r1=Bit[c].Query(xs,ys);
int r2=Bit[c].Query(xs,y-1);
int r3=Bit[c].Query(x-1,ys);
int r4=Bit[c].Query(x-1,y-1);
printf("%d\n",r1-r2-r3+r4);
}
return 0;
}