树状数组
作者:
91lyh
,
2022-09-05 11:46:59
,
所有人可见
,
阅读 147
- 前缀和: 普通数组O(n),树状数组O(logn)
- 区间和:普通数组O(n),树状数组O(logn)
- 点更新:修改
a[i]
加上z, 普通数组O(1),树状数组O(logn)
- 点查询:普通数组O(1),树状数组O(logn)(
sum[i] - sum[i-1]
)
- 区间更新:区间a[i]到a[j]的所有元素加上z,普通数组O(n),树状数组O(nlogn)
const int maxn = 10005;
int n, a[maxn], c[maxn];
int lowbit(int i)
{
return (-i)&i;
}
void add(int i, int z)
{
for(; i <= n; i+=lowbit(i))
c[i] += z;
}
int sum(int i)
{
int res;
for(;i > 0; i -= lowbit(i))
res += c[i];
return res;
}
int sum(int i, int j)
{
return sum(j) - sum(i-1);
}
int main()
{
memset(c, 0, sizeof(c));
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
add(i, a[i]);
}
int x1, x2;
cin >> x1;
cout << sum(x1) << endl;
cin >> x1 >> x2;
cout << sum(x1, x2) << endl;
return 0;
}