zoukankan      html  css  js  c++  java
  • HDU 1556 Color the ball (树状数组 区间更新+单点查询)

    题目链接

    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

    分析:
    染色,每次染[a, b],然后查询所有1--n个节点每个节点被染得次数。。。
    对更新[a, b],则将a位置加1就相当于将这个位置往后的地方全部加1了,然后将b+1位置减1就相当于将这个位置往后的位置都减1了,那下次查找的位置x如果在这个区间后面的话,肯定就没有被加1了,如果x在a与b的中间,则一定加1了。。。

    代码:

    #include <iostream>
    #include<stdio.h>
    #include<string.h>
    #define maxn 100000 + 10
    using namespace std;
    int n,a,b,c[maxn];
    int lowbit(int x)
    {
        return x & (-x);
    }
    void update(int index,int val)
    {
        for(int i = index; i <= n; i += lowbit(i))
            c[i] += val;
    }
    
    int  sum(int index)
    {
        if(index == 0)
            return 0;
    
        int ans = 0;
        for(int i = index; i > 0; i -= lowbit(i))
            ans += c[i];
    
        return ans;
    }
     
    int main()
    {
        while(~scanf("%d",&n) && n)
        {
            memset(c,0,sizeof(c));
            for(int i = 1; i <= n; i++)
            {
                scanf("%d %d",&a,&b);
                update(a,1);//对大于等于a的+1
                if(b + 1!= n + 1)//特判最后一个气球如果是不用减
                    update(b + 1,-1);//对大于b的-1,实现a-b区间的气球都+1
            }
            for(int i = 1; i <= n; i++)
                printf(i == 1 ? "%d" : " %d", sum(i));//注意输出格式
            printf("
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    POJ 3660 Cow Contest (floyd求联通关系)
    POJ 3660 Cow Contest (最短路dijkstra)
    POJ 1860 Currency Exchange (bellman-ford判负环)
    POJ 3268 Silver Cow Party (最短路dijkstra)
    POJ 1679 The Unique MST (最小生成树)
    POJ 3026 Borg Maze (最小生成树)
    HDU 4891 The Great Pan (模拟)
    HDU 4950 Monster (水题)
    URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
    URAL 2037 Richness of binary words (回文子串,找规律)
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7910332.html
Copyright © 2011-2022 走看看