HDU 2795 Billboard 【线段树维护区间最大值&&查询变形】
任意门: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
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.
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.
2
4
3
3
3
2
1
3
-1
题意概括:
有一个 高为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 【线段树维护区间最大值&&查询变形】的更多相关文章
- HDU 2795 Billboard 线段树,区间最大值,单点更新
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- ACM学习历程—HDU 2795 Billboard(线段树)
Description At the entrance to the university, there is a huge rectangular billboard of size h*w (h ...
- HDU 2795 Billboard (线段树+贪心)
手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/article/details/77488127 URL: http ...
- 51nod 1376【线段树维护区间最大值】
引自:wonter巨巨的博客 定义 dp[i] := 以数字 i(不是下标 i)为结尾的最长上升长度 然后用线段树维护 dp[i]: 每个节点维护 2 个信息,一个是当前区间的最大上升长度,一个是最大 ...
- [HDU] 2795 Billboard [线段树区间求最值]
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2795 Billboard (线段树单点更新 && 求区间最值位置)
题意 : 有一块 h * w 的公告板,现在往上面贴 n 张长恒为 1 宽为 wi 的公告,每次贴的地方都是尽量靠左靠上,问你每一张公告将被贴在1~h的哪一行?按照输入顺序给出. 分析 : 这道题说明 ...
- HDU 2795 Billboard (线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题目大意:有一块h*w的矩形广告板,要往上面贴广告; 然后给n个1*wi的广告,要求把广告贴 ...
- hdu 2795 Billboard 线段树单点更新
Billboard Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=279 ...
- hdu 2795 Billboard 线段树+二分
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
随机推荐
- Python获取当前时间及格式化
1.导入time模块 # 导入time模块 import time 2.打印时间戳-time.time() # 导入time模块 import time # 打印时间戳 print(time.time ...
- rem.js的用法及在浏览器端的适配
首先介绍下自己,我是从后端转前端,对于前端的见识还不深望各位全当一个新手自述....... 随着移动设配的更新换代,市场上涌现了大量的非主流设备分辨率,比如华为手机...... 更新换代快的大前提下自 ...
- linux 拓展之linux纯命令行界面变为图形界面
使用版本为6.x 1, 连接网络 没网络就下载不了哦 2,设置下yum源,我本机原来的yum源是网易的但是我用不了,我设置阿里云可以下载, 你们有这问题的可以试试 3, yum groupin ...
- 阿里云Tomcat运行shutdown.sh命令关闭时遇到的问题
1.安装完成jdk之后,然后安装tomcat. tomcat安装成功后,进入tomcat的安装目录,找到bin所在的目录. 使用./startup.sh,启动tomcat; 使用./shutdown. ...
- HDU 4460 Friend Chains
Problem Description For a group of people, there is an idea that everyone is equals to or less than ...
- Fragment、Activity比较——Android碎片介绍
Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法.Fragmen ...
- 0.数据结构(python语言) 基本概念 算法的代价及度量!!!
先看思维导图: *思维导图有点简陋,本着循循渐进的思想,这小节的知识大多只做了解即可. *重点在于算法的代价及度量!!!查找资料务必弄清楚. 零.四个基本概念 问题:一个具体的需求 问题实例:针对问题 ...
- 4、Angular2 pipe
1. stateless pipe 2.stateful pipe
- 阿里巴巴国际站 网站和PC客户端都登录不了,其他电脑或手机可以
背景 昨天晚上,我还能打开阿里巴巴国际站,PC客户端也可以登录 今天早上起床打开电脑,发现国际站的网站打开不了,客户端也登录不了,提示了错误信息,但是其他电脑或手机就可以登录 原因分析 1.是不是本机 ...
- 转载:解决IE下a标签会触发window.onbeforeunload的问题
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...