Color the ball(差分数组+树状数组维护)

时间:2022-12-19 16:36:41

Color the ball

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 25532    Accepted Submission(s): 12406


Problem Description
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
 

Input
每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
当N = 0,输入结束。
 

Output
每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。
 

Sample Input
 
 
31 12 23 331 11 21 30
 

Sample Output
 
 
1 1 13 2 1
 

Author
8600
 

Source

思路:树状数组区间求和,单点更新+(差分数组思维)

就是在左端点+1,右端点后面-1就可以了,在求区间和。。。。

代码:

/*树状数组区间求和,单点更新->区间更新,单点查询
  树状数组维护差分数组的值;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 1e5+7;
int tg[maxn];

int lowbit(int x) {
    return x&(-x);
}

void add(int x, int k) {
    for(int i = x; i < maxn; i += lowbit(i))
        tg[i] += k;
}

int getsum(int x) {
    int sum = 0;
    for(int i = x; i > 0; i-=lowbit(i))
        sum += tg[i];
    return sum;
}



int main()
{
    int n;
    while(~scanf("%d", &n)&&n) {
        memset(tg, 0, sizeof(tg));
        int a, b;
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d", &a, &b);
            add(a, 1); add(b+1, -1);
        }
        for(int i = 1; i < n; i++)
            printf("%d ", getsum(i));
        printf("%d\n", getsum(n));
    }
    return 0;
}

还有更简单的方法(这里借用某神的代码):

#include <cstdio>  
int a[100011];  
void init(int n)  
{  
    for (int i = 1 ; i <= n ; i++)  
        a[i] = 0;  
}  
int main()  
{  
    int n;  
    while (~scanf ("%d",&n) && n)  
    {  
        init(n);  
        for (int i = 1 ; i <= n ; i++)  
        {  
            int x,y;  
            scanf ("%d %d",&x,&y);  
            a[x]++;  
            a[y+1]--;  
        }  
        printf ("%d",a[1]);  
        for (int i = 2 ; i <= n ; i++)  
        {  
            a[i] += a[i-1];  
            printf (" %d",a[i]);  
        }  
        printf ("\n");  
    }  
    return 0;  
}