树状数组
概念
树状数组(Binary Indexed Tree || Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和。
思考
往往需要进行区间求和的时候,我们会使用树状数组。但问题往往不是很简单,我们难以看出怎么运用树状数组。做了几道关于树状数组的题后发现,很多题,都需要我们对题意进行变换,将其数据变得具有一定的顺序性,这样方便我们使用树状数组求和。
例如,青出于蓝而胜于蓝 这道题,我们要先记录下每个节点在dfs序列中的位置,然后就可以从1 到 n 依次顺序遍历。
例如 棋子等级 这道题,由于题目给出的Y坐标是递增的,因此数据本身就是具有顺序性的,因此直接可以得出 degree[ i ] = getsum(x)
完整代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }