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了呀!我向来都是唯果论,不问过程,只看结果。数据结构这种东西如果只掌握模板还有什么意思,只有了解其中的原理才能够更好的用模板。

原文地址:https://www.cnblogs.com/FriskyPuppy/p/10204192.html