树状数组模板
区间求和:
tree[t]中储存的是[t,t-lowbit(t)+1]中每个数的和。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define MAXN 100
int tree[MAXN];
int N;
int lowbit(int t)
{
return t&(-t);
}
void add(int index,int value)//单点更新
{
for(int i=index ; i<=N ; i+=lowbit(i))
{
tree[i] += value;
}
}
int getSum(int index)//区间查询
{
int sum = 0;
for(int i=index ; i>0 ; i-=lowbit(i))
{
sum += tree[i];
}
return sum;
}
int main(void)
{
cin>>N;
memset(tree,0,sizeof(tree));
for(int i=1 ; i<=N ; i++)
{
int mid;
cin>>mid;
add(i,mid);
}
return 0;
}
区间求最值
tree[t]储存的是[t,t-lowbit(t)+1]中每个数的最大值。
求区间最值的算法中还有一个board[i]数组,表示第i个数是多少。
board[MAXN];
void updata(int x) //单点更新
{
int lx, i;
while (x <= n)
{
tree[x] = board[x];
lx = lowbit(x);
for (i=1; i<lx; i<<=1)
tree[x] = max(tree[x], tree[x-i]);
x += lowbit(x);
}
}
int query(int x, int y) //区间查询
{
int ans = 0;
while (y >= x)
{
ans = max(board[y], ans);
y --;
for (; y-lowbit(y) >= x; y -= lowbit(y))
ans = max(tree[y], ans);
}
return ans;
}
注意:LOWBIT无法处理0的情况,因为它的结果也是0,那么最终就是一个死循环