hdu 1556 Color the ball

来源:互联网 发布:x免费域名 编辑:程序博客网 时间:2024/05/22 17:08

Color the ball

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


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


区间更新相同的值时,如[x,y],在y之前(包括y)每个数加1,在x之前(不包括x)每个数减1,这样就是区间[x,y]的更新。
注意:这里的更新add是从后往前更新
/*也可以从前往后,则将代码改为
void add(int x,int d){    while( x <= N ){        c[x] += d;        x += lowbit(x);    }}int sum(int x ){    int ans = 0 ;    while(x ){        ans += c[x];        x-=lowbit(x);    }    return ans ;}
并且下面改为
add(x,1);add(y+1,-1);
*/

#include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;#define INF 0x3f3f3f3f#define inf -0x3f3f3f3f#define mem0(a) memset(a,0,sizeof(a))#define mem1(a) memset(a,-1,sizeof(a))#define FOPENIN(IN) freopen(IN, "r", stdin)#define FOPENOUT(OUT) freopen(OUT, "w", stdout)#define maxn 100000+10int a[maxn],c[maxn],N;int lowbit(int x) {    return x&(-x);}void add(int x,int d){    while( x > 0 ){        c[x] += d;        x -= lowbit(x);    }}int sum(int x ){    int ans = 0 ;    while(x <= N){        ans += c[x];        x+=lowbit(x);    }    return ans ;}int main(){   while(scanf("%d",&N),N){        int x,y;        mem0(c);        for(int i = 0 ; i < N ; i++){            scanf("%d %d",&x,&y);            add(y,1);            add(x-1,-1);        }        for(int i = 1 ; i <= N; i++){            printf("%d%c",sum(i),(i==N)?'\n':' ');        }   }   return 0;}




0 0