zoukankan      html  css  js  c++  java
  • 树状数组

    概念

    树状数组(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
  • 相关阅读:
    Sublime Text配置Python开发利器
    Python字符进度条
    安装和使用的django的debug_toolbar
    Python数组合并
    django创建项目
    Python的闭包
    Python获取对象的元数据
    Python的枚举类型
    Django的Model上都有些什么
    Git使用相关
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/10500585.html
Copyright © 2011-2022 走看看