Billboard 题解 hdu2795
Billboard 题解 hdu2795
题意
有个广告牌,上面需要依次贴广告,广告的高度均为1,但是宽度不同,每次都想贴在最靠左上的位置,按照顺序进行广告的话,输出每个广告位于广告牌的高度。
解题思路
使用线段树,来维护区间最大值,这样我们每次查找的时候都先判断上面点的最大值是不是大于广告的宽度,根据题意大于就先判断左节点,左节点不行再右节点,然后找到具体的点。如果小于的话,那个这个节点和他下面的节点就都不行了。
下面代码,基本上就是线段树的模板,就是维护区间的最大值这个是重点。
代码实现
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2e5+7;
int a[maxn<<2];
int h, w, n, ans;
void up(int rt)
{
a[rt]=max(a[rt<<1], a[rt<<1|1]);
}
void update(int rt, int l, int r, int x)
{
if(l==r){
a[rt]-=x;//表示在高度为rt处,贴完广告后剩下的宽度
ans=l;
return;
}
int mid=(l+r)>>1;
if(a[rt<<1] >= x) update(rt<<1, l, mid, x); //先看左节点是否可以
else update(rt<<1|1, mid+1, r, x);
up(rt); //记得更新当前节点的最大值
}
int main()
{
while(scanf("%d%d%d", &h, &w, &n)!=EOF)
{
int R=min(h,n);
for(int i=1; i<=(R<<2); i++)
{
a[i]=w; //这里相当于建立线段树,因为开始肯定都是宽度w了
}
int wi;
for(int i=1; i<=n; i++)
{
scanf("%d", &wi);
if(a[1] < wi) printf("-1\n");//a[1]维护的是整个区间的最大值,这个如果都不满足的话,就可以输出-1了。
else
{
update(1, 1, R, wi);
printf("%d\n", ans);
}
}
}
return 0;
}
Billboard 题解 hdu2795的更多相关文章
- 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)
原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解 By 岩之痕 目录: 一:综述 ...
- 线段树-hdu2795 Billboard(贴海报)
hdu2795 Billboard 题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子 思路:每次找到最大值的位子,然后减去L 线段树功能:query:区间求最大值的位子(直接 ...
- 【hdu2795】Billboard
Problem Description At the entrance to the university, there is a huge rectangular billboard of size ...
- HDU-------(2795)Billboard(线段树区间更新)
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU2795 Billboard 【线段树】+【单点更新】
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu2795(Billboard)线段树
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- Blocked Billboard II题解--模拟到崩溃的模拟
前言 比赛真的状态不好(腐了一小会),导致差点爆0. 这个题解真的是在非常非常专注下写出来的,要不然真的心态崩. 题目 题目描述 奶牛Bassie想要覆盖一大块广告牌,她在之前已经覆盖了一小部分广告牌 ...
- 【HDU2795】Billboard(线段树)
大意:给一个h*w的格子,然后给出多个1*w的板子往格子里面填,如果有空间尽量往上一行填满,输出行数,无法填补,则输出-1: 可以使用线段树转化问题,将每一排的格子数目放到每一个叶子节点上,然后每有一 ...
- 【线段树求最靠前】【HDU2795】【Billboard】
题意: 有一个H*W的广告牌,当插入一个广告时(1*Wi),问最靠前的插入方式是什么 新生赛有个类似的题目,可惜当时居然没水过去. 果断用线段树做 以H为线段 建树,存[l,r]中最大的宽度,因为区间 ...
随机推荐
- oozie与hue整合 执行WC案例报错: 连接10020端口被拒绝
Call From hdp-05/192.168.230.15 to hdp-01:10020 failed on connection exception: java.net.ConnectExce ...
- 关于在IOS中 contenteditable=true 无法输入的问题
解决: 1.添加样式-webkit-user-select:text 2.如果引入了fastclick,需要添加个类名 needsclick 来源于知乎(https://www.zhihu.com/q ...
- JavaScript自增和自减
一.自增++ 通过自增运算符可以使变量在自身的基础上加一: 对于一个变量自增以后,原变量的值会立即自增一: 自增符号:++ 自增分为两种:1.后++(a++):2.前++(++a): 共同点:a++ ...
- 13 Spring Boot Shiro使用JS-CSS-IMG
filterChainMap.put("/403", "anon");filterChainMap.put("/assets/**", &q ...
- mysql BETWEEN操作符 语法
mysql BETWEEN操作符 语法 作用:选取介于两个值之间的数据范围.这些值可以是数值.文本或者日期.大理石平台 语法:SELECT column_name(s) FROM table_name ...
- mysql DISTINCT语句 语法
mysql DISTINCT语句 语法 作用:用于返回唯一不同的值. 语法:SELECT DISTINCT 列名称 FROM 表名称.扬州大理石量具 mysql DISTINCT语句 示例 //从表中 ...
- Wannafly挑战赛16 #E 弹球弹弹弹 splay+基环树+各种思维
链接:https://ac.nowcoder.com/acm/problem/16033来源:牛客网 有n个位置,标号为1到n的整数,m次操作,第i次操作放置一个弹球在b[i] xor c[i-1]处 ...
- Golang在京东列表页实践总结
Golang在京东列表页实践总结 作者:张洪涛 10余年软件开发和设计经验,曾就职于搜狐.搜狗.前matrixjoy公司联合创始人.甘普科技CTO. 目前线上状态 基于搜索实现: 全量数据,搜索结果不 ...
- ubantu apache2.4.6 apache https配置
[root@VM_58_118_centos dbback]# a2enmod ssl [root@VM_58_118_centos dbback]# service apache2 restart ...
- 【PowerOJ1751&网络流24题】数字梯形问题(费用流)
题意: 思路: [问题分析] 求图的最大权不相交路径及其变种,用费用最大流解决. [建模方法] 规则(1) 把梯形中每个位置抽象为两个点<i.a>,<i.b>,建立附加源S汇T ...