[BZOJ1452/Luogu4054][JSOI2009]Count计数问题

题目链接:

BZOJ1452

Luogu4054

二维树状数组题(或许可以毒瘤树套树

注意到值域范围为(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
",r1-r2-r3+r4);
		}
	return 0;
}
原文地址:https://www.cnblogs.com/LanrTabe/p/10450969.html