HDU 1556 Color the ball

来源:互联网 发布:复杂网络的建模 编辑:程序博客网 时间:2024/05/22 14:59
个气球排成一排,从左到右依次编号为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
3  1 1  2 2  3 3  3  1 1  1 2  1 3  0


Sample Output
1 1 1  3 2 1  
 
本来这题属于线段树的,但是用了些技巧就不用了,就是记录每段更新区间的首尾两个值的变化,
(首)加一,(尾+1)减一;最后某点颜色的修改次数就是该点及该点之前所有值的累加。实践证明,前置加比后置加快。 
AC code:


#include <iostream>


int f[100010];


int main() {
    int n;
    int i;
    while ( scanf("%d",&n) , n ) {
        memset(f,0,(n+1)*sizeof(int));
        for ( i = 0 ; i < n ; ++i ) {
            int a,b;
            scanf("%d%d",&a,&b);
            ++f[a];  
            --f[b+1];
        }
        int m = 0;
        for (  i = 1 ; i < n ; ++i ) {
            m += f[i];
            printf("%d ",m);
        }9                                                                                                                                                                               
        m += f[i];
        printf("%d\n",m);
    }
    return 0;
}
0 0
原创粉丝点击