树状数组!!! (只能用于区间求和,其他的还是要靠线段树,但是这种思想很重要。)
int n ;//元素总个数
int tree[n];//树状数组
int exp[n];//原数据数组
int lowbit(int i)//求 x
{
return i&(-i) ;
}
void refresh( int i ,int y)
{
//单点更新
while( i <= n )
{
tree[i] += y ;
i = i + lowbit(i);
}
}
int sum( int i )
{
//前 i 项和
int sum = 0 ;
while( i > 0)
{
sum += tree[i];
i -= lowbit(i);
}
return sum ;
}
int range_sum(int i ,int j)
{
//区间求和
return sum(j) - sum(i) ;
}
void build_tree()
{
//建树状数组
for(int i = 1 ; i <= n ; i++)
{
refresh(i,exp[i]);
}
}
ST表!!!
ST表就是一个用来解决rmq(区间最值)问题的算法。
ST表不支持在线修改。