Color the ball
时间:2015-07-07 17:03:00
收藏:0
阅读:109
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,输入结束。
当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
/* Author:2486 Memory: 3468 KB Time: 998 MS Language: G++ Result: Accepted */ #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn=100000+5; int sum[maxn<<2],col[maxn<<2]; int N,a,b; void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void pushdown(int rt,int m) { if (col[rt]) { col[rt<<1] += col[rt]; col[rt<<1|1] += col[rt]; sum[rt<<1] +=col[rt] * (m - (m >> 1)); sum[rt<<1|1] += col[rt] * (m >> 1); col[rt] = 0; } } void build(int rt,int l,int r) { col[rt]=0; if(l==r) { sum[rt]=0; return; } int mid=(l+r)>>1; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); } void update(int L,int R,int c,int rt,int l,int r) { if(L<=l&&r<=R){ col[rt]+=c; sum[rt]+=c*(r-l+1); return ; } pushdown(rt,r-l+1); int mid=(l+r)>>1; if(L<=mid)update(L,R,c,rt<<1,l,mid); if(mid<R)update(L,R,c,rt<<1|1,mid+1,r); pushup(rt); } int query(int L,int R,int rt,int l,int r) { if(L<=l&&r<=R){ return sum[rt]; } pushdown(rt,r-l+1); int mid=(l+r)>>1; int ret=0; if(mid>=L)ret+=query(L,R,rt<<1,l,mid); if(mid<R)ret+=query(L,R,rt<<1|1,mid+1,r); return ret; } int main() { #ifndef ONLINE_JUDGE freopen("D://imput.txt","r",stdin); #endif // ONLINE_JUDGE while(~scanf("%d",&N),N) { build(1,1,N); for(int i=0; i<N; i++) { scanf("%d%d",&a,&b); update(a,b,1,1,1,N); } for(int i=1;i<=N;i++){ if(i!=1)printf(" "); printf("%d",query(i,i,1,1,N)); } printf("\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
评论(0)