• 树状数组


    树状数组

    关于树状数组的具体介绍可见刘汝佳《算法竞赛入门经典:训练指南》

            对于一个n元素的数组A[n]。可运行例如以下操作:

            Add(I, d):让A[i]变成A[i]+d。

            Query(L, R):返回A[L]+A[L+1]+…+A[R]。

            注意:树状数组仅仅能计算A[1]開始的和。A[0]这个元素是不能用的。

    上面操作复杂度都是O(logn)。

            事实上树状数组还能够处理区间更新,单点查询的问题。如HDU 1556 Color the ball,可是此类问题还是用线段树做比較直观。

    以下是代码:

    const int maxn=10000+5;//最大元素个数
    
    int n;//元素个数
    int c[maxn];//c[i]==A[i]+A[i-1]+...+A[i-lowbit(i)+1]
    
    //返回i的二进制最右边1的值
    int lowbit(int i)
    {
        return i&(-i);
    }
    
    //返回A[1]+...A[i]的和
    int sum(int i)
    {
        int res=0;
        while(i>0)
        {
            res += c[i];
            I -= lowbit(i);
        }
        return res;
    }
    
    //令A[i] += val
    void add(int I,int val)
    {
        while(i<=n)
        {
            c[i] += val;
            I += lowbit(i);
        }
    }

    注意。刚開始c数组要初始全0,然后每读入一个数A[i]就运行一步add(i, A[i])来进行真正的初始化。

    且树状数组处理的数组A[n]是从小标1開始的,也即A[0]是一个没实用的元素。

     

     

    树状数组:基本应用

    HDU 1166 敌兵布阵(简单树状数组):基本应用。

    解题报告。

     

     

    树状数组:标记数组,单点更新

    UVA 1428 Pingpong(树状数组):基本题型,只是须要转换一下思维。

    解题报告!

    POJ 2299Ultra-QuickSort(树状数组+离散化或归并排序求逆序):须要离散化数据然后用树状数组解决。可是用归并排序的思想更方便。解题报告!

    POJ 2352HDU1541 Stars(树状数组):基本题型。解题报告!

    POJ 2481 Cows(树状数组):基本题型,可是注意当两个节点全然同样时,可是我们又不能把同样的节点算入要求的节点数目里面时该怎么办?解题报告。

    POJ 3067Japan(树状数组): 排序之后转化为求数列逆序数。解题报告!

    HDU 1394Minimum Inversion Number(树状数组):依旧是求逆序数。解题报告!

    POJ 3378 CrazyThairs(数据集中+DP+树状数组+高精度):综合应用只是DP不难,数据集中不难,树状数组不难,高精度也不难。解题报告!

    HDU 3450Counting Sequences(树状数组+DP+离散化):综合题。一步步拆解。解题报告。

    HDU 3743 FroshWeek(树状数组或归并排序求逆序):又是一题求逆序的。解题报告!

    HDU 2838 CowSorting(树状数组):非常巧妙的思维。解题报告!

    POJ 2182 LostCows(树状数组,暴力解法):暴力解法更好理解一点。

    解题报告。

    POJ 1990MooFest(树状数组+离线处理): 须要一定的转换思维。

    解题报告!

     

     

    树状数组:区间更新,单点查询

    HDU 1556 Colorthe ball(树状数组):区间更新。

    解题报告!

     

     

    树状数组:单点更新,删除元素

    HDU 3874Necklace(树状数组+离线处理):须要巧妙的删除元素。解题报告。

     

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    explicit
    boolalpha 和 noboolalpha
    C++ 头文件一览
    C++ I/O库总结
    Error:collect2:ld returned 1 exit status (总结)
    常用目录的作用
    硬盘分区与硬软链接
    POJ3694 Network(Tarjan双联通分图 LCA 桥)
    2016"百度之星"
    2016"百度之星"
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4751154.html
Copyright © 2020-2023  润新知