美文网首页
树状数组与离散化

树状数组与离散化

作者: 华雨欣 | 来源:发表于2020-11-10 16:04 被阅读0次

用途

树状数组主要用来求解前缀和、区间和、逆序对、区间和的个数和相关求个数的问题等等问题,最重要的是要考虑怎么将题目给的信息转化为一个前缀和,这一点是比较难想到的。

模板

int[] tr;
int n;

public int lowbit(int i) {
    return i & -i;
}

public void add(int i, int k) {
    for (; i <= n; i += lowbit(i))
        tr[i] += k;
}

public int sum(int i) {
    int res = 0;
    for (; i > 0; i -= lowbit(i))
        res += tr[i];
    return res;
}

n就是原数组,初始化时 tr = new int[n + 1];
当然也可以将这些变量和方法封装到一个类中,方便重复使用,不过一般的树状数组的问题只需要一个树状数组即可。

离散化

离散化就是当数据个数较少但比较分散并且我们只关心相对大小时,将他们的值分别映射到区间[1, N],这样就可以依赖树状数组来处理数据了。

// 离散化、去重
TreeSet<Long> set = new TreeSet<>();
HashMap<Long, Integer> map = new HashMap<>();
for (int i = 0; i <= nums.length; i++) {
    set.add(preSum[i]);
    set.add(preSum[i] - lower);
    set.add(preSum[i] - upper);
}
int idx = 1;
for (Long num : set) {
    map.put(num, idx++);
}

要注意映射后的左端点为1,这样可以方便树状数组操作,树状数组的sum(i)方法就表示 目标值小于等于i的前缀和,通过该sum方法做减法、求最值、比较大小等等就可以方便的求出一些特定问题。
另外,排序也可以直接映射,不过java中没有unique方法,无法去重。去重的步骤可以提高效率,不影响正确性。

相关文章

  • 树状数组与离散化

    用途 树状数组主要用来求解前缀和、区间和、逆序对、区间和的个数和相关求个数的问题等等问题,最重要的是要考虑怎么将题...

  • 树状数组_逆序数_离散化

    http://poj.org/problem?id=2299http://blog.csdn.net/suwei1...

  • 树状数组求逆序对原理

    归并排序和树状数组都可以用nlogn的算法做到求出逆序对.但这里着重讲树状数组的原理与求法.树状数组最常用的方面就...

  • 数据结构(二)

    树状数组 POJ 1990: MooFest关于x坐标建立树状数组。先按照v值升序排序,逐个添加到树状数组里。每次...

  • 三种一维树状数组

    单点修改+区间查询 最基本的树状数组 树状数组入门 模板(洛谷P3374 【模板】树状数组1) 区间修改+单点查询...

  • 树状结构转一维数组

    树状结构转数组方法 声明树状对象

  • 树状数组

    复习一下树状数组 树状数组 一种用于处理单点修改和区间查询的数据结构。树状数组C的定义: C[x] = Sum ...

  • 树状数组模板复习

    树状数组模板复习

  • 「树状数组」

    题目传送门 poj1990题意: 农夫的N (N∈[1, 20,000])头牛参加了"MooFest"之后有了不...

  • 树状数组

    参见: https://www.cnblogs.com/hsd-/p/6139376.htmlhttps://bl...

网友评论

      本文标题:树状数组与离散化

      本文链接:https://www.haomeiwen.com/subject/xjhlbktx.html