今天学习了一下树状数组,做一个简单总结。
树状数组可分为两种操作,
(1)修改单个点,统计区间和
一般为 向上修改(update1),向下统计(sum1)
(2)修改区间,统计单个点
一般为向下修改(update2),向上统计(sum2)
主要模板如下:
int c[N];
int lowbit(int x) {return x&(-x);} //用于确定区间范围
int sum1(int x)
{
int sm=0;
while(x>0)
{
sm+=c[x];
x-=lowbit(x);
}
return sm;
}
int sum2(int x)
{
int sm=0;
while(x<N)
{
sm+=c[x];
x+=lowbit(x);
}
return sm;
}
void update1(int x,int num)
{
while(x<N)
{
c[x]+=num;
x+=lowbit(x);
}
}
void update2(int x,int num)
{
while(x>0)
{
c[x]+=num;
x-=lowbit(x);
}
}
二维树状数组(修改点,统计区间)
const int MAX=1200;
int c[MAX][MAX];
int n;
int LowBit(int t)
{
return t&(-t);
}
int Sum(int endx,int endy)
{
int sum=0;
int temp=endy;
while(endx>0)
{
endy=temp;//
while (endy>0)
{
sum+=c[endx][endy];
endy-=LowBit(endy);
}
endx-=LowBit(endx);
}
return sum;
}
void add(int addx,int addy,int num)
{
int temp=addy;
while (addx <=n)
{
addy=temp;
while(addy<=n)
{
c[addx][addy]+=num;
addy+=LowBit(addy);
}
addx+=LowBit(addx);
}
}
int GetSum(int l,int b,int r,int t)
{
return Sum(r,t)-Sum(r,b-1)-Sum(l-1,t)+Sum(l-1,b-1);
}