树状数组

概念

树状数组(Binary Indexed Tree || Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和。

思考

往往需要进行区间求和的时候,我们会使用树状数组。但问题往往不是很简单,我们难以看出怎么运用树状数组。做了几道关于树状数组的题后发现,很多题,都需要我们对题意进行变换,将其数据变得具有一定的顺序性,这样方便我们使用树状数组求和。

例如,青出于蓝而胜于蓝 这道题,我们要先记录下每个节点在dfs序列中的位置,然后就可以从1 到 n 依次顺序遍历。

例如 棋子等级 这道题,由于题目给出的Y坐标是递增的,因此数据本身就是具有顺序性的,因此直接可以得出 degree[ i ] = getsum(x)

完整代码

#include <cstdio>
#include <iostream>
#include <stack>
#include <algorithm>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100000
using namespace std;
int n;
int a[100];
int c[100];
int lowbit(int x) {
    return x & (-x);
}
void change(int i, int x) {
    //i为第几个要修改的元素
    //x为修改后与修改前的差值
    while (i <= MAX) {
        c[i] += x;
        i = i + lowbit(i);//最近父节点
    }
}
int getsum(int i) {
    int sum = 0;
    while (i > 0) {
        sum += c[i];
        i = i - lowbit(i);//最近子节点
    }
        return sum;
}
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int t;
        cin >> t;
        change(i, t);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/woxiaosade/p/10500585.html