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

原创 2015年07月07日 15:15:04
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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Color the ball - HDU 1556 - 线段树 区间更新单点查询

Color the ball - HDU 1556 - 线段树 区间更新单点查询  国际惯例中文题目不解释,思路直接裸线段树,Lazy思想入门题。  Lazy传送门:延迟更新详解AC代码:// // ...

HDU1556 Color the ball(线段树区间更新)

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

hdu 1556 color the ball 线段树区间更新 加lazy标记

题意:给你一排气球让你涂色, 有n个操作,表示将[l,r]区间的球涂色,问最后1~n的气球被涂色的次数。#include #include #include const int MAXN = 1000...

HDU~1556 Color the ball(线段树区间更新||树状数组)

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T...

HDU 1556 Color the ball 线段树 区间更新

原题: http://acm.hdu.edu.cn/showproblem.php?pid=1556#include #include"cstdio" #include"string.h" usi...

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

原题地址 Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O...

HDU 1556 Color the ball 线段树更新区间查点

点击打开链接 Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/...

HDU1556:Color the ball(线段树区间更新)

Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a   Input 每个测试实例第一行为一个整数N,(N 当...

HDU-1556-Color the ball-线段树+区间更新+单点查询

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 好吧,一道这么简单的题结果因为我的粗心卡了一下午。。。orz.... #include #inc...
  • wlxsq
  • wlxsq
  • 2015年08月03日 16:57
  • 315

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

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU - 1556 Color the ball (线段树 + 区间更新)
举报原因:
原因补充:

(最多只允许输入30个字)