HDU - 1556 Color the ball (线段树 + 区间更新)

C - Color the ball
Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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

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;
}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18661257/article/details/46789947
个人分类: ACM_数据结构
上一篇钱币兑换问题
下一篇Friendship
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭