zoukankan      html  css  js  c++  java
  • hdu 2795 线段树(二维问题一维化)

    Billboard

    Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 10961    Accepted Submission(s): 4863


    Problem Description
    At the entrance to the university, there is a huge rectangular billboard of size h*w (h is its height and w is its width). The board is the place where all possible announcements are posted: nearest programming competitions, changes in the dining room menu, and other important information.

    On September 1, the billboard was empty. One by one, the announcements started being put on the billboard.

    Each announcement is a stripe of paper of unit height. More specifically, the i-th announcement is a rectangle of size 1 * wi.

    When someone puts a new announcement on the billboard, she would always choose the topmost possible position for the announcement. Among all possible topmost positions she would always choose the leftmost one.

    If there is no valid location for a new announcement, it is not put on the billboard (that's why some programming contests have no participants from this university).

    Given the sizes of the billboard and the announcements, your task is to find the numbers of rows in which the announcements are placed.
     

     

    Input
    There are multiple cases (no more than 40 cases).

    The first line of the input file contains three integer numbers, h, w, and n (1 <= h,w <= 10^9; 1 <= n <= 200,000) - the dimensions of the billboard and the number of announcements.

    Each of the next n lines contains an integer number wi (1 <= wi <= 10^9) - the width of i-th announcement.
     

     

    Output
    For each announcement (in the order they are given in the input file) output one number - the number of the row in which this announcement is placed. Rows are numbered from 1 to h, starting with the top row. If an announcement can't be put on the billboard, output "-1" for this announcement.
     

     

    Sample Input
    3 5 5 2 4 3 3 3
     

     

    Sample Output
    1 2 1 3 -1
     

     

    Author
    hhanger@zju
     

     

    Source
     
    这道题的大意是指在一个高为h,宽为w的广告牌上贴广告,告诉你广告的长都为1,宽度不确定,要你输出广告所粘贴的位置。如果所给的广告不能贴在广告牌上,就输出-1.
    这道题中,由于广告的长度都是确定的,那么在考虑广告能否贴在广告牌上时可以忽略起长度,以宽度作为标准来确定其是否能被贴上去。然后在利用线段树就可以解答了。
    AC代码:

    #include<stdio.h>
    #include<string.h>
    struct
    {
     int a,b;
     int flag;
     int room;
    }t[800060];
    int h,w,n;
    void make(int x,int y,int num)
    {
     t[num].a=x;
     t[num].b=y;
     t[num].room=w;.//一开始误会了,还以为宽度可以累加,其实不论高度是多少,宽度总是一定的。
     if(x==y)
      return;
     make(x,(x+y)/2,num*2);
     make((x+y)/2+1,y,num*2+1);
    }
    int insert(int num,int space)
    {
     if(t[num].a==t[num].b)
     {

      t[num].room-=space;
      return t[num].a;
     }
     int ans;
     if(t[num*2].room>=space)
      ans=insert(num*2,space);
     else if(t[num*2+1].room>=space)
      ans=insert(num*2+1,space);
     t[num].room=t[num*2].room>t[num*2+1].room?t[num*2].room:t[num*2+1].room;//在一个高度范围内,其所能容纳的广告的宽度为其孩子节点中的最大宽度。
     return ans;
    }
    int main()

     int i,o,res;
     while(scanf("%d%d%d",&h,&w,&n)!=EOF)
     {
      if(h>n)
       h=n;
      res=0;
      make(1,h,1);
      for(i=1;i<=n;i++)
      {
       scanf("%d",&o);
       if(t[1].room<o)
        printf("-1 ");
       else
       {
        res=insert(1,o);
        printf("%d ",res);
       }
      }
     }
     return 0;
    }


     

     
  • 相关阅读:
    090828 H 小道理
    091031 T PowerShell Solution
    关注我们共有的家园,别让企鹅成为传说
    发布网站时自动切换connectionString
    bookmark: partitioned tables in sql server 2005
    it did suprise me a little bit..
    无法删除附加到事件上的匿名代理
    如何在自己工程项目中使用TouchJSON框架
    VMware 8安装苹果操作系统Mac OS X 10.7 Lion正式版
    Net线程间通信的异步机制
  • 原文地址:https://www.cnblogs.com/hbutACMER/p/3916482.html
Copyright © 2011-2022 走看看