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): 26275    

    Accepted Submission(s): 12734


    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
     
    思路:最开始被涂色次数都是相同的为0,而每次涂色都是对区间内所有的值+1,最坏O(n²)的暴力是不可能暴力的,此处介绍O(n)的前缀和做法,代码量也很少。其实之前我们在POJ3263一题中有介绍过前缀和的思想,即把对一个区间的操作转化为左、右两个端点上的操作。不过上次是口胡的,没有自己画一画的同学应该是一知半解的,这次借此题复习一下。
    做法是这样的:开两个数组c、d,我用c数组代表要输出的数组,即气球真实被涂色次数,显然一开始都是0。而用d数组用来“一旦给出一个区间要求我们进行涂色操作,我们将其左右端点在d上标记”。此处先给出c和d的递推关系式,请结合下面的图来理解我们是如何用标记完的d数组来求出所需的c数组。

    随意举个例子,比如最开始c和d都是0,我们先涂1~3,则需要d[1]++,d[3+1]--;意味着第1个下标应该比第0个下标的c值多1(实际上是多了d[1],这里刚修改过一次所以是1),而第4个下标应该比第3个下标的c值少1(同上)。

    假如这个时候没输入完,我们还不能就这么早求c。在上面的基础上再输入一组,涂2~3,显然这样子结束以后我们要输出的c是:1,2,2。试一下看看对不对。

     

    希望这次的图示讲解能把前缀和的大概意思讲明白。这样子有兴趣的同学可以回去重做一下POJ3263,基本思路是一样的,只是区间开闭不同。

    此次代码没有注释,因为上面已经解释得差不多了。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 int n,a,b;
     8 int d[100005],c[100005];
     9 
    10 int main()
    11 {
    12     while(~scanf("%d",&n)&&n)
    13     {
    14         memset(d,0,sizeof(d));
    15         memset(c,0,sizeof(c));
    16         for(int i=1;i<=n;i++)
    17         {
    18             scanf("%d%d",&a,&b);
    19             if(a>b) swap(a,b);
    20             d[a]++;
    21             d[b+1]--;
    22         }
    23         for(int i=1;i<=n;i++)
    24             c[i]=c[i-1]+d[i],printf("%d%c",c[i]," 
    "[i==n]);
    25     }
    26     return 0;
    27 }
  • 相关阅读:
    Android项目实战(五十五):部分机型点击home再点图标进入程序不保留再之前界面的问题
    Android项目实战(五十四):zxing 生成二维码图片去除白色内边距的解决方案
    关于RecyclerView嵌套导致item复用异常,界面异常的问题
    191114
    191112
    191111
    191110
    191109
    191108
    191107
  • 原文地址:https://www.cnblogs.com/AlphaWA/p/9211679.html
Copyright © 2011-2022 走看看