题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795

Billboard

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

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
 
题目大意:有一块尺寸为h*w的矩形长板,要在上面贴1*wi的海报n张。海报贴的位置要尽量靠左,如果一行能够填满就填满,最后输出的是这张海报贴的高度位置。
 
解题思路:用高度进行建树,每一次比较宽度,在结构体里面定义一个mmax来表示最大的宽度,这个宽度在Updata()这个函数中不断地更新。一直不断的将以下的最大值反馈到父亲结点。
 
特别注意:1、如果高度是5,但是有2个海报,这样我们就不需要建高度为5的树了,现在看来没有特别大的区别,但是题目中给的数据是1 <= h,w <= 10^9; 1 <= n <= 200,000~~
     2、这个题目要求输出的是你更新的位置,所以就可以少一个查找的函数。再更新的函数里面,如果这个位置更新了,就可以直接输出这个位置就OK了。
     3、一定要先比较左结点,在比较右结点。左不行在考虑右。
 
详见代码。
 
 #include <iostream>
#include <cstdio> using namespace std; struct node
{
int l,r;
int mmax;
} s[*]; void InitTree(int l,int r,int k,int w)
{
s[k].l=l;
s[k].r=r;
s[k].mmax=w;
if (l==r)
return ;
int mid=(l+r)/;
InitTree(l,mid,*k,w);
InitTree(mid+,r,*k+,w);
} void UpdataTree(int num,int k)//进行点的更新
{
if (s[k].r==s[k].l)
{
printf ("%d\n",s[k].l);
s[k].mmax-=num;
return ;
}
if (num<=s[k*].mmax)
UpdataTree(num,k*);
else
UpdataTree(num,k*+);
s[k].mmax=s[k*].mmax>s[k*+].mmax?s[k*].mmax:s[k*+].mmax;
} int main ()
{
int h,w,n,a;
while (~scanf("%d%d%d",&h,&w,&n))
{
int hh=h>n?n:h;
InitTree(,hh,,w);
for (int i=; i<=n; i++)
{
scanf("%d",&a);
if (a<=s[].mmax)
UpdataTree(a,);
else
printf ("-1\n");
}
}
return ;
}
 

hdu 2795 Billboard(线段树+单点更新)的更多相关文章

  1. hdu 2795 Billboard 线段树单点更新

    Billboard Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=279 ...

  2. HDU 2795 Billboard (线段树单点更新 && 求区间最值位置)

    题意 : 有一块 h * w 的公告板,现在往上面贴 n 张长恒为 1 宽为 wi 的公告,每次贴的地方都是尽量靠左靠上,问你每一张公告将被贴在1~h的哪一行?按照输入顺序给出. 分析 : 这道题说明 ...

  3. HDU 2795 Billboard 线段树,区间最大值,单点更新

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. HDU 2795 Billboard (线段树+贪心)

    手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/article/details/77488127 URL: http ...

  5. HDU 2795 Billboard (线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题目大意:有一块h*w的矩形广告板,要往上面贴广告;   然后给n个1*wi的广告,要求把广告贴 ...

  6. HDU 3308 LCIS(线段树单点更新区间合并)

    LCIS Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting ...

  7. ACM学习历程—HDU 2795 Billboard(线段树)

    Description At the entrance to the university, there is a huge rectangular billboard of size h*w (h ...

  8. hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值

    Conturbatio Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...

  9. [HDU] 2795 Billboard [线段树区间求最值]

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  10. HDU 2795 Billboard 线段树活用

    题目大意:在h*w 高乘宽这样大小的 board上要贴广告,每个广告的高均为1,wi值就是数据另给,每组数组给了一个board和多个广告,要你求出,每个广告应该贴在board的哪一行,如果实在贴不上, ...

随机推荐

  1. python获取本地时间

    python本地时间 import time # 格式化成2016-03-20 11:45:39形式 now = time.strftime("%Y-%m-%d %H:%M:%S" ...

  2. 【Docker 命令】- ps命令

    docker ps : 列出容器 语法 docker ps [OPTIONS] OPTIONS说明: -a:显示所有的容器,包括未运行的. -f:根据条件过滤显示的内容. --format :指定返回 ...

  3. MySQL event调度

    基本命令 //查看事件调度是否开启 show variables like '%event_scheduler%'; //开启事件调度 SET GLOBAL event_scheduler = ON; ...

  4. NetScaler VLAN’s Demystified

    NetScaler VLAN’s Demystified https://www.citrix.com/blogs/2014/12/29/netscaler-vlans-demystified/ Th ...

  5. 【BZOJ2648】SJY摆棋子(KD-Tree)

    [BZOJ2648]SJY摆棋子(KD-Tree) 题面 BZOJ Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一 ...

  6. BZOJ3930:[CQOI2015]选数——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3930 https://www.luogu.org/problemnew/show/P3172#sub ...

  7. HDU.1233 还是畅通工程(Prim)

    HDU.1233 还是畅通工程(Prim) 题意分析 首先给出n,代表村庄的个数 然后出n*(n-1)/2个信息,每个信息包括村庄的起点,终点,距离, 要求求出最小生成树的权值之和. 注意村庄的编号从 ...

  8. 用live()方法给新增节点绑定事件

    jQuery 给所有匹配的元素附加一个事件处理函数,即使这个元素是以后再添加进来的也有效. 这个方法是基本是的 .bind() 方法的一个变体.使用 .bind() 时,选择器匹配的元素会附加一个事件 ...

  9. pexpect正确的打开方式

    今天在写一个Python脚本时遇到一个问题——同样的代码,在Python终端执行没问题,在脚本里执行却不行,就是下面这段代码: import pexpect password = 'test2014' ...

  10. Educational Codeforces Round 6 B

    B. Grandfather Dovlet’s calculator time limit per test 1 second memory limit per test 256 megabytes ...