首页 > 其他分享 >写模板,树状数组。

写模板,树状数组。

时间:2024-03-26 13:24:50浏览次数:28  
标签:sz ft 树状 int lowbit pos long 数组 模板

1 根据长度初始化, 单点更新, 区间查询。
可以查询区间和(输入为位置+数值),
可以查询区间内频次(输入为数值+频次1)。
2 根据输入数据线性初始化。
3 根据输入数据频次线性初始化,区间更新,单点查询。
根据差分后的数组求前缀和(单点查询)。

  class FenwickTree{
public:
    FenwickTree(int sz): sz_(sz){
        ft_.resize(sz_);
    }

    FenwickTree(vector<long long>& f){
        sz_ = int(f.size());
        ft_.assign(sz_, 0);
        for (int i = 1; i < sz_; ++i){
            ft_[i] += f[i];
            if (i + lowbit(i) < sz_){
                ft_[i + lowbit(i)] += ft_[i];
            }
        }
    }

    FenwickTree(vector<int>& s){
        sz_ = *max_element(s.begin() + 1, s.end()) + 1;
        ft_.resize(sz_);
        for (size_t i = 1; i < s.size(); ++i){
            ft_[s[i]] ++;
            if (s[i] + lowbit(s[i]) < sz_){
                ft_[s[i] + lowbit(s[i])] += ft_[s[i]];
            }
        }
    }

    void update(int pos, long long value){
        while (pos < sz_){
            ft_[pos] += value;
            pos += lowbit(pos);
        }
    }

    void update(int l, int r, long long value){
        update(l, value);
        update(r + 1, -value);
    }

    long long query(int p){
        assert(p < sz_);
        long long res = 0;
        while (p > 0){
            res += ft_[p];
            p -= lowbit(p);
        }
        return res;
    }

    long long query(int l, int r){
        assert(l <= r);
        return query(r) - query(l - 1);
    }


private:
    int sz_;
    vector<long long> ft_;


private:
    inline int lowbit(int x) {return (x & (-x));}
};

标签:sz,ft,树状,int,lowbit,pos,long,数组,模板
From: https://www.cnblogs.com/yxcblogs/p/18096448

相关文章

  • 洛谷 P3374 【模板】树状数组 1
    classFenwickTree{public:FenwickTree(intsz):sz_(sz){ft_.resize(sz_);}FenwickTree(vector<longlong>&f){sz_=int(f.size());ft_.assign(sz_,0);for(inti=1;i<sz_;++i){ft......
  • 洛谷 P3368 【模板】树状数组 2
    classFenwickTree{public:FenwickTree(intsz):sz_(sz){ft_.resize(sz_);}FenwickTree(vector<longlong>&f){sz_=int(f.size());ft_.assign(sz_,0);for(inti=1;i<sz_;++i){ft......
  • js数组对象合并
    合并数组,对象合并(Array/Objectmerging)合并数组和对象合并则是指将两个数组或对象合并为一个新的数组或对象。在JavaScript中,我们可以使用不同的方法来实现这种合并,比如使用 concat 方法来合并数组,或者使用对象展开运算符(spreadoperator)来合并对象。例如,合并两个数组可以这样......
  • 并查集专题(附并查集模板)P3367 【模板】并查集 P1656 炸铁路
    并查集模板f数组要初始化autofind(autox){if(f[x]==x)returnx;elsereturnf[x]=find(f[x])路径压缩,同一条路上都归到一个点上}voidunionset(autoa,autob){f[find(a)]=find(b);auto会自动适配数据类型} P3367【模板】并查集题目描述如题......
  • C++11标准模板(STL) 算法(std::reverse)
    定义于头文件<algorithm>算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first,last) ,其中 last 指代要查询或修改的最后元素的后一个元素。逆转范围中的元素顺序std::reverse1)反转[first,last)范围中的元素顺序表......
  • 复制(拷贝)数组的方法
    1.Arrays类的copyOf()方法2.Arrays类的copyOfRange()方法3.System类的arraycopy()方法4.Object类的clone()方法(1)copyOf()方法是以指定的长度复制原数组,然后返回一个新数组,如果长度超过原数组,会以数组类型的默认值进行填充(2)copyOfRange()方法则将指定原数组的指定长度范......
  • golang模板库之fasttemplate
    简介fasttemplate是一个比较简单、易用的小型模板库。fasttemplate的作者valyala另外还开源了不少优秀的库,如大名鼎鼎的fasthttp,前面介绍的bytebufferpool,还有一个重量级的模板库quicktemplate。quicktemplate比标准库中的text/template和html/template要灵活和易用很多,后面会专......
  • js数组遍历方法及应用,看这篇就够了
    背景:日常开发中处理数组常用到的遍历方法,看这篇就够了目录数组遍历方法forforEachfor...ofmapfilterfor...inreduce求和、求积数组去重计算数组中每个元素出现的次数将二维数组转化为一维将多维数组转化为一维对象里的属性求和按对象属性给数组分组简单对比数组......
  • 88.合并两个有序数组
    非递减顺序,即非严格递增序列自己没写出来classSolution{publicvoidmerge(int[]nums1,intm,int[]nums2,intn){inttail1=m-1;inttail2=n-1;inttail=nums1.length-1;while(tail1>=0&&tail2>=0){//区别......
  • 26.删除有序数组中的重复项
    自己写的,双指针,用tail指针指向不重复有序数组的末尾元素,用index指针进行遍历数组,遇到和末尾元素不一样的元素,放到tail+1的位置,然后tail指针加1classSolution{publicstaticintremoveDuplicates(int[]nums){inttail=0;intindex=0;in......