为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

多维树状数组

来自NOCOW
跳转到: 导航, 搜索

多维树状数组,顾名思义,是树状数组在多维空间上的扩展.它可以动态维护多维空间的前序和.

目录

[编辑] 意义

c[x,y,z,....]表示的是a[x-lowbit(x)+1,y-lowbit(y)+1,z-lowbit(z),....]到a[x,y,z,....]内的区间和.

[编辑] 操作

和一维树状数组类似

[编辑] 修改

复杂度O(log(n)^k)

void modify(int w,int x,int y,int z....)
{
	for(int x1=x;x1<=n;x1+=lowbit(x1))
		for(int x2=y;x2<=n;x2+=lowbit(x2))
			for(int x3=z;x3<=n;x3+=lowbit(x3))
				....
					c[x1][x2][x3][....]+=w;
	return ;
}

[编辑] 查询

O(log(n)^k)

long query(long x,long y,long z,....)
{
	long ans=0;
	for(int x1=x;x1>0;x1-=lowbit(x1))
		for(int x2=y;x2>0;x2-=lowbit(x2))
			for(int x3=z;x3>0;x3-=lowbit(x3))
				....
					ans+=c[x1][x2][x3][....];
	return ans;
}

查询区间(x,y)-(x1,y1)时,可根据容斥原理,调用query(x1,y1)-query(x-1,y1)-query(x1,y-1)+query(x-1,y-1);

[编辑] 参见

个人工具