任意门: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): 28743    Accepted Submission(s): 11651

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 的公告墙,要在上面贴 N 个 高恒为1 宽为 W 的广告(每次都是优先左上方向),输出广告贴的高度 h;

解题思路:

线段树的子节点维护 1~H 每一层的所剩的最大值 Wi,每次查询不是找最大值,而是找到最大值所在的结点位置(第几层)

Tip:模板是死的,数据结构是活的。

Push操作从叶子结点往上更新;

线段树最大的边界不一定是输入的 H ,也可能是 N(极限每一层只贴一个)

但用min会超时很多,淳朴的 if 语句判断 H 还是 N 小就好

查询先遍历左子树后遍历右子树,因为优先贴左边。

看似简单的东西要自己亲手去敲代码才能发现问题所在。

AC code:

 #include <bits/stdc++.h>
#define lson l, mid, root<<1
#define rson mid+1, r, root<<1|1
using namespace std; const int MAXN = 2e5+;
int maxh[MAXN<<], hb;
int H, W, N;
int read()
{
int f=,x=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
x*=f;
return x;
}
void Build(int l, int r, int root)
{
maxh[root] = W;
if(l == r) return;
//int mid = l+((r-l)>>1);
int mid = (l+r)>>;
Build(lson);Build(rson);
}
void Push(int Root)
{
maxh[Root] = max(maxh[Root<<], maxh[Root<<|]);
} void Update(int pos, int l, int r, int root, int len)
{
if(l == r){maxh[root]+=len;return;}
//int mid = l+((r-l)>>1);
int mid = (l+r)>>;
if(pos <= mid) Update(pos, lson, len);
else Update(pos, rson, len);
Push(root);
}
int Query(int l, int r, int root)
{
if(l == r) return l;
int mid = (l+r)>>;
int res = ;
if(maxh[root<<] >= hb) res = Query(lson);
else res = Query(rson);
return res;
}
int main()
{
while(~scanf("%d %d %d", &H, &W, &N)){
if(H > N) H = N;
Build(, H, );
for(int i = ; i <= N; i++)
{
hb = read();
//scanf("%d", &hb);
if(maxh[] < hb) printf("-1\n");
else{
int now = Query(, H, );
Update(now, , H, , -hb);
printf("%d\n", now);
}
}
}
return ;
}

HDU 2795 Billboard 【线段树维护区间最大值&&查询变形】的更多相关文章

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

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

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

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

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

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

  4. 51nod 1376【线段树维护区间最大值】

    引自:wonter巨巨的博客 定义 dp[i] := 以数字 i(不是下标 i)为结尾的最长上升长度 然后用线段树维护 dp[i]: 每个节点维护 2 个信息,一个是当前区间的最大上升长度,一个是最大 ...

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

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

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

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

  7. HDU 2795 Billboard (线段树)

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

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

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

  9. hdu 2795 Billboard 线段树+二分

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

随机推荐

  1. Unity GetComponentsInChildren<T>(true);

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class GetCompo ...

  2. underscore javascript工具库支持seajs模块化

    underscore是一个很有用的js工具库,但是好像默认不支持seajs模块化 新建一个文件例如叫做xx.js 谈后,键入 define(function(require,exports,modul ...

  3. mysql 存储过程(proceduce)查询一个表的结果插入另外一个表

    公司的时间戳存证业务,对发版过程中间数据处理需要用到存储过程.对此做一个简短记录,以免遗忘. DROP procedure record_timestamp_deal ; ##创建存储过程 creat ...

  4. bzoj 5084: hashit

    Description 你有一个字符串S,一开始为空串,要求支持两种操作 在S后面加入字母C 删除S最后一个字母 问每次操作后S有多少个两两不同的连续子串 Solution 先忽略删除操作,建出最终的 ...

  5. spring-boot 1.4.x遇到的cpu高的问题

    如果你的spring-boot应用里tomcat线程耗cpu较高,并主要耗在做读取jar的操作上(堆栈类似下面),可能跟我们遇到同样的问题. CRC32.update(byte[], int, int ...

  6. js 获取时间相关

    $(document).ready(function () {            var date = new Date();            var sb = "";  ...

  7. 2017年10月30日 vs初级教学

    Console.Write("Hello World!"); / / 插入 Hello World!            Console.WriteLine("Hell ...

  8. (三)PHP网页架站

    目前,Windows下已经有集成的PHP网页架站工具,例如:AppServ.WampServer.这些软件将Apache.PHP.MySQL.phpMyAdmin集成到一起,极大地方便了开发者架站.但 ...

  9. 重构指南 - 移除重复内容(Remove Duplication)

    在项目中或多或少的都存在着重复的或者功能相似的代码,如果要对代码做改动,就要修改多个地方,所以我们需要将多处重复的代码提取到一个公共的地方供统一调用,以减少代码量,提高代码可维护性. 重构前代码 pu ...

  10. mysql三:表操作

    一.存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制. 详见:点击查看 二.表的介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标 ...