HDU 1556 数据结构-树状数组-改段求点

Posted friskypuppy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1556 数据结构-树状数组-改段求点相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556

解题思路:树状数组,只要了解树状数组的原理就不用死记模板了,总之树状数组管理的就是前缀和,高度越高的的结点管理的范围越广

      所以要是改点求段:更改一个点就要向上传递

      所以要是改段求点:更改一个点就要向下传递

代码:

技术分享图片
#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;
const int MAXN = 1e5 + 7;

int a[MAXN];
int t;

int low_bit(int k) {
    return k & -k;
}
void update(int i, int val) {
    while(i > 0) {
        a[i] += val;
        i -= low_bit(i);
    }
}
int sum(int k) {
    int ret = 0;
    while(k <= t) {
        ret += a[k];
        k += low_bit(k);
    }
    return ret;
}
int main() {
    //freopen("in.txt","r",stdin);
    while(~scanf("%d", &t) && t) {
        memset(a, 0, sizeof(a));
        int b, c;
        int temp = t;
        while(temp--) {
            scanf("%d%d", &b, &c);
            // cout << "b: " << b << " c: " << c << endl;
            update(c, 1);
            if(b > 1) update(b-1, -1);
        }
        printf("%d", sum(1));
        for(int i = 2; i <= t; i++) {
            printf(" %d", sum(i));
        }
        printf("
");
    }
    return 0;
}
View Code

思考:今年2019了呀!我向来都是唯果论,不问过程,只看结果。数据结构这种东西如果只掌握模板还有什么意思,只有了解其中的原理才能够更好的用模板。

以上是关于HDU 1556 数据结构-树状数组-改段求点的主要内容,如果未能解决你的问题,请参考以下文章

树状数组的改段求点,改段求段

树状数组模板(改点求段 / 该段求点 / 改段求段)

hdu (1556 树状数组)

hdu-1556 树状数组嘤嘤嘤

HDU 1556 树状数组

hdu 1556 Color the ball (扫描线+树状数组)