zoukankan      html  css  js  c++  java
  • HDU 1556 Color the ball

    Color the ball

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


    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
    3
    1 1
    2 2
    3 3
    3
    1 1
    1 2
    1 3
    0
     
    Sample Output
    1 1 1
    3 2 1
     
    Author
    8600
     
    Source
     
     
     
    解析:树状数组(区间更新,单点查询)。
     
     
     
    #include <cstdio>
    #include <cstring>
    #define lowbit(x) (x)&(-x)
    
    int n, a, b;
    int c[100005];
    
    void add(int i, int val)
    {
        while(i <= n){
            c[i] += val;
            i += lowbit(i);
        }
    }
    
    int sum(int i)
    {
        int ret = 0;
        while(i > 0){
            ret += c[i];
            i -= lowbit(i);
        }
        return ret;
    }
    
    int main()
    {
        while(scanf("%d", &n), n){
            memset(c, 0, sizeof(c));
            for(int i = 1; i <= n; ++i){
                scanf("%d%d", &a, &b);
                add(a, 1);
                add(b+1, -1);
            }
            for(int i = 1; i < n; ++i)
                printf("%d ", sum(i));
            printf("%d
    ", sum(n));
        }
        return 0;
    }
    

    由于题目输出是在所有操作完成之后才输出,故也可以直接得到前缀和输出。

    #include <cstdio>
    #include <cstring>
    
    int n, a, b;
    int c[100005];
    
    int main()
    {
        while(scanf("%d", &n), n){
            memset(c, 0, sizeof(c));
            for(int i = 1; i <= n; ++i){
                scanf("%d%d", &a, &b);
                ++c[a];
                --c[b+1];
            }
            for(int i = 1; i < n; ++i){
                c[i] += c[i-1];
                printf("%d ", c[i]);
            }
            c[n] += c[n-1];
            printf("%d
    ", c[n]);
        }
        return 0;
    }
    
  • 相关阅读:
    万字总结:学习MySQL优化原理,这一篇就够了!
    sql中自连接的使用
    SQL 优化原则
    Thumbnailator java图片压缩,加水印,批量生成缩略图
    java使用Thumbnailator处理图片
    Mysql优化原则_小表驱动大表IN和EXISTS的合理利用
    MySQL千万级多表关联SQL语句调优
    了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表
    【explain】MySQL联表查询中的驱动表
    pyCharm最新2018激活码
  • 原文地址:https://www.cnblogs.com/inmoonlight/p/5721653.html
Copyright © 2011-2022 走看看