• 连续和查询问题


    问题定义:连续和查询问题。给定一个(n)个元素的数组 (A_1, A_2, ..., A_n),你的任务是设计一个数据结构,支持一个查询操作Query(L, R),计算(A_L+A_L+...+A_R)

    基本的想法:借助前缀和思想,利用(O(n))时间将(n)个元素每个元素和前面的和求出,得到(S_i=A_1+A_2+...+A_i)。在查询的时候仅仅需要(O(1))的时间。但是如果需要更改区间中的元素,则需要将之前计算出来的前缀和更改,最坏情况下需要更改所有的前缀和,复杂度达到(O(n))

    树状数组:利用树状数组解决动态连续和查询问题,树状数组可以在(O(log n))的复杂度内更改基本想法中的“前缀”。树状数组支持如下两种操作:

    • (Add(x, d))操作:让(A_x)增加(d)
    • (Query(L, R))操作:计算(A_L+A_{L+1}+...+A_R)

    其查询的复杂度也是(O(logn))

    借用了Claris的代码,非常精简适合静静放在程序的最前头当做模板。具体的树状数组原理再写一篇博客。

    const int maxn=100000+10;
    int bit[maxn];
    // 向x位置的元素添加d
    inline void add(int x,int d){while(x<=maxn){bit[x]+=d;x+=x&-x;}}
    // 求出从1到x的和
    inline int sum(int x){int ret=0;while(x>0){ret+=bit[x];x-=x&-x;}}
    

    那么可以使用这两种操作再写出一个函数,来完成查询区间(Query)的需求

    int query(int l, int r) { return sum(r)-sum(l-1); }
    
  • 相关阅读:
    DevOps平台中的自动化部署
    GitLab的安装及使用教程
    Nginx配置相关
    Shell常用模块
    PostgreSQL基础
    大数据集群监控工具
    大数据常用组件
    kafka知识
    数据结构可视化(包括红黑树动态演示)
    python 周考1
  • 原文地址:https://www.cnblogs.com/jeffy-chang/p/6935552.html
Copyright © 2020-2023  润新知