一维差分树状数组

搭建一维差分数组可以很方便的进行区间修改和单点查询

include

define N 100

using namespace std;
int c[N], a[N],tree[N];
int n;

int lowbit(int x)
{
return x & (-x);
}

void change(int x,int v)
{
while (x <= n) {
tree[x] += v;
x += lowbit(x);
}
}

void add(int l,int r ,int v)//区间修改
{
change(l, v);
change(r + 1, -v);
}

int ask(int x)//单点查询
{
int res = 0;
while (x > 0) {
res += tree[x];
x -= lowbit(x);
}
return res;
}

void set()//建立一维树状数组
{
for (int i = 1; i <= n; i++)
{
for (int j = i - lowbit(i)+1; j <= i; j++)
{
tree[i] += c[j];
}
cout << tree[i]<<' ';
}
cout << endl;
}

int main()
{
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
c[i] = a[i] - a[i - 1];
}
set();
cout << ask(3);
}

posted @ 2021-10-04 15:27  empty_thought  阅读(50)  评论(0)    收藏  举报