1. 程式人生 > 其它 >一維差分陣列

一維差分陣列

搭建一維差分陣列可以很方便的進行區間修改和單點查詢

#include<iostream>
#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);
}