hdoj 1556

来源:互联网 发布:广电网络宽带收费标准 编辑:程序博客网 时间:2024/05/07 14:00

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1556

题意:

给一堆气球涂色,每次涂色的区间为[a, b],涂N次,问每个气球被涂了多少次。

思路:

利用树状数组的特点,但要注意的是当从区间a涂到b时,b之后的数组要减1次,这样在sum取结果时才不会出错。

AC代码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define lowbit(x) x & (-x)const int M = 100020;int tree[M], n;void add(int a, int b){    while(a <= n)    {        tree[a] += b;        a += lowbit(a);    }}int sum(int a){    int total = 0;    while(a > 0)    {        total += tree[a];        a -= lowbit(a);    }    return total;}main(){    while(cin >> n && n)    {        memset(tree, 0, sizeof(tree));        for(int i = 1; i <= n; i++)        {            int a, b;            scanf("%d %d", &a, &b);            add(a, 1);            add(b + 1, -1);        }        cout << sum(1);        for(int i = 2; i <= n; i++)            printf(" %d", sum(i));        cout << endl;    }}


0 0