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

hhanger大神的题目,水题都得有点思维。

题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子
思路:每次找到最大值的位子,然后减去L
线段树功能:query:区间求最大值的位子(直接把update的操作在query里做了)

技巧挺好,一开始自己思路建个超大二维数组,显然内存不够。

然后。  线段树的话其实就是深搜,if(l==r) 返回的肯定是最左边的结点,哈~

判断的时候直接用Max[1]与p比较就能判断是否输出-1,赞一个!!

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,rint h,w,n;const int maxn=200005;// 是200000还是20000要搞清楚
int Max[maxn<<2];     //开maxn的多少倍结合最底层的结点数加以注意void Pushup(int rt)
{Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
void build(int rt,int l,int r)
{Max[rt]=w;if(l==r) return;int m=(l+r)>>1;build(lson);build(rson);
}
int query(int p,int rt,int l,int r)//技巧5 . update放在query里面了
{if(l==r){Max[rt]-=p;return l;// 2. 返回行数}int m=(l+r)>>1;int ret;ret=(Max[rt<<1]>=p)?query(p,lson):query(p,rson);// 技巧1.这地方深搜返回最左边的结点即符合的。Pushup(rt);// 技巧4 . 自己写这个地方有可能会忘return ret;
}int main()
{while(scanf("%d%d%d",&h,&w,&n)!=EOF){if(h>n) {h=n;}build(1,1,h);int p;for(int i=1;i<=n;i++){scanf("%d",&p);if(Max[1]<p) printf("-1\n"); // 技巧3.Max[1]最根结点一定是最大值else{int ans=query(p,1,1,h);printf("%d\n",ans);}}}return 0;
}

HDU2795 billboard【转化为线段树。】相关推荐

  1. 线段树详解 (原理,实现与应用)

    线段树详解 By 岩之痕 目录: 一:综述 二:原理 三:递归实现 四:非递归原理 五:非递归实现 六:线段树解题模型 七:扫描线 八:可持久化 (主席树) 九:练习题 一:综述 假设有编号从1到n的 ...

  2. 线段树区间扫描线超详解,一篇文章搞懂扫描线

    怨念 这个专题其实不难,但是翻了一圈网上的博客,写得是云里雾里,我打算用一篇博客把它讲明白 前序知识 能看懂这篇文章需要: 线段树基础知识. 线段树染色问题基本概念. 离散化操作 目标 首先这个扫描线 ...

  3. P5568 [SDOI2008]校门外的区间(离散数学应用+线段树+开闭区间处理)(校门三部曲)难度⭐⭐⭐⭐

    校门三部曲,总算完结了!完结散花! 难度呈阶梯状,都可以用线段树解决. 第一部 P1047 校门外的树(线段树优化)难度⭐⭐ 第二部 P1276 校门外的树(增强版)(线段树)校门三部曲难度⭐⭐⭐ 第 ...

  4. poj3171(dp + 线段树)

    (和 poj1769 几乎一样,利用线段树dp的基础题) 题目大概意思为选几个区间,使 M 到 E 全都被覆盖,求选取区间的最少数量 (我们把从 M 到 E 转化成从 1 到 E - M + 1 ) ...

  5. poj1769(dp + 线段树)

    题目大概意思为选几个区间,使 1 到 n 全都被覆盖,求选取区间的最少数量 dp[i][j] : 意思为到第 i 个区间为止,能刚好覆盖到 j 的最小区间数目 例:区间为[1,10],[5,20],则 ...

  6. 时空旅行[线段树分治][维护凸壳]

    文章目录 前言 题目 思路 代码 前言 肝了一上午-这是我才学线段树分治的例题-真舒服 题目 温馨提示:首先在UOJ做,LOJ挖数据,BZOJ终极评测... UOJ198 二手剽- 思路 为什么不能用 ...

  7. poj 2528 Mayor's posters(线段树 离散化 区间更新 贴海报)

         这个题目本来对大神来说可能是水题, 对我就不行了,昨晚非折腾到下半夜一点 搞定, 并且可以总结出 ,只有把问题想清楚,或着看人家解题报告自己把问题和代码思路 搞清楚,才能谈的上调bug,否则 ...

  8. 【HDU2795】Billboard(线段树)

    大意:给一个h*w的格子,然后给出多个1*w的板子往格子里面填,如果有空间尽量往上一行填满,输出行数,无法填补,则输出-1: 可以使用线段树转化问题,将每一排的格子数目放到每一个叶子节点上,然后每有一 ...

  9. hdu2795 Billboard 线段树

    题意: 给出一块h*w的广告牌,还有n张1*u的海报,海报尽量往上,左边的位置张贴,问每一张海报能贴的多高. 线段树单点修改. 注意:因为1 <= h,w <= 10^9; 1 <= ...

  10. HDU2795 Billboard 线段树

    这是一道简单的线段树,只需要考虑好我们建树的方式即可! 我们以高h来建树,点的权值为W,通过来维护区间的最大值,我们很快就能查找到编号最小的点切大于等于wi..明白之后就是一道简单的线段树单点更新,维 ...

最新文章

  1. php10-e 豪华版,华为畅享 10e 规格参数
  2. kalivm 虚拟机访问win文件夹_利用vmware搭建属于自己的win虚拟环境
  3. 删除数据 DataIntegrityViolationException: not-null property references a null or transient value解决...
  4. 云原生微服务架构的技术内涵
  5. 【KEIL·单片机·扫盲贴】关于ARM单片机程序内存使用情况的细致讨论。
  6. VB.NET循环体内的局部变量
  7. junit jndi_使用Spring创建用于JUnit测试的JNDI资源
  8. 基于java的程序启动出错Could not create the Java virtual machine
  9. 《The Art of Readable Code》学习笔记(一)
  10. grade java_Gradle Java 构建入门
  11. Pygal简介、画廊--各种图形绘图代码
  12. linux tcp cork,Socket选项系列之TCP_CORK(转)
  13. pycharm安装带激活码2018
  14. 关于Android的自动化测试,你需要了解的5个测试框架
  15. 基于hadoop构建对象存储系统_基于Hadoop企业私有云存储平台的构建
  16. rpm 完全卸载mysql
  17. Bex5文档服务器,不通过登录直接打开BeX5的首页和功能页的url是什么?
  18. arm linux 掉电检测,如何实现单片机掉电检测与数据掉电保存?-嵌入式系统-与非网...
  19. 编写程序,统计某旅馆住宿客人的总数,要求输入客人姓名,输出客人编号(按先后顺序自动生成),姓名以及总人数。...
  20. [ Linux驱动炼成记 ] 12 -音频驱动TAS5754添加EQ参数

热门文章

  1. windows 服务的安装与卸载之bat脚本命令
  2. zabbix 添加 host item
  3. win2008 401 - 未授权: 由于凭据无效,访问被拒绝。解决方法
  4. bookstrap必备的基础知识
  5. AppCan移动平台,开发者是这样用的……
  6. linux多路径配置
  7. 基于Struts实现用户登录和注册模块
  8. 西瓜书boosting learning 集成的错误率推导
  9. 使用VIsio绘制E-R图
  10. 【练习】Java实现的杨辉三角形控制台输出