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
  • 相关阅读:
    JSP内置/隐式对象(9个)
    会话技术——Cookie&Session
    Head First Java——读书笔记(一)
    并发和并行
    HotSpot
    域对象的比较
    书籍——Java
    润乾报表基础知识
    Android引导页过多导致OOM内存泄漏
    AngularJS 之1-初识
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/10500585.html
Copyright © 2011-2022 走看看