【HDU2795】Billboard(线段树)
大意:给一个h*w的格子,然后给出多个1*w的板子往格子里面填,如果有空间尽量往上一行填满,输出行数,无法填补,则输出-1;
可以使用线段树转化问题,将每一排的格子数目放到每一个叶子节点上,然后每有一块板子,进行query查询靠左子树的第一个大于板子的叶子,进行update操作更新叶子。每个节点附权值max叶子节点即可。令一个小坑是h和w的范围是1e9,数组太大。试想如果格子高度h > 板子的个数n,那么我们只需要压缩格子到n个高度即可。所有给叶子节点的存储空间就能压缩成n的范围即1e6。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cmath> 6 #include <cctype> 7 #include <algorithm> 8 #include <numeric> 9 #include <climits> 10 #include <vector> 11 #include <string> 12 using namespace std; 13 14 const int maxn = 200000 + 10; 15 int maxv[maxn << 2]; 16 17 void PushUp (int rt) { 18 maxv[rt] = max (maxv[rt * 2], maxv[rt * 2 + 1] ); 19 } 20 21 void build (int w, int l, int r, int rt) { 22 maxv[rt] = w; 23 if (l == r) { 24 return ; 25 } 26 int m = (l + r) / 2; 27 build (w, l, m, rt * 2); 28 build (w, m + 1, r, rt * 2 + 1); 29 } 30 31 int query (int x, int l, int r, int rt) { 32 if (r == l) { 33 maxv[rt] -= x; 34 return l; 35 } 36 int m = (l + r) / 2; 37 int ret; 38 if (maxv[rt * 2] >= x) { 39 ret = query (x, l, m, rt * 2); 40 } else { 41 ret = query (x, m + 1, r, rt * 2 + 1); 42 } 43 PushUp(rt); 44 return ret; 45 } 46 47 int main () { 48 int h, w, n; 49 50 while (~scanf ("%d %d %d", &h, &w, &n)) { 51 if (h > n) { 52 h = n; 53 } 54 build (w, 1, h, 1); 55 while (n --) { 56 int x; scanf ("%d", &x); 57 if (maxv[1] < x) { 58 printf ("%d\n", -1); 59 } else { 60 printf ("%d\n", query (x, 1, h, 1)); 61 } 62 } 63 } 64 return 0; 65 }
转载于:https://www.cnblogs.com/Destiny-Gem/p/3877485.html
【HDU2795】Billboard(线段树)相关推荐
- hdu2795 Billboard 线段树
题意: 给出一块h*w的广告牌,还有n张1*u的海报,海报尽量往上,左边的位置张贴,问每一张海报能贴的多高. 线段树单点修改. 注意:因为1 <= h,w <= 10^9; 1 <= ...
- HDU2795 Billboard 线段树
这是一道简单的线段树,只需要考虑好我们建树的方式即可! 我们以高h来建树,点的权值为W,通过来维护区间的最大值,我们很快就能查找到编号最小的点切大于等于wi..明白之后就是一道简单的线段树单点更新,维 ...
- HDU 2795 Billboard (线段树+贪心)
HDU 2795 Billboard (线段树+贪心) 手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/articl ...
- HDU - 2795 Billboard(线段树)
题目链接:点击查看 题目大意:给定一个高度为h,宽度为w的广告牌,接下来以此给出n个高度为1,宽度为w的广告,我们需要将广告优先贴在最上边.最左边,问给出的每一个广告应该贴在哪一行,若没有位置贴了则输 ...
- HDU_2795 Billboard(线段树)
/*题意:输出每次贴上的海报所在的行号,行号为1...h; 开始拿到这题没思路,后来问了问本校的大牛,终于找到思路.这题是按high建树,结构体中定义一个len变量,存放当前该结点的空闲长度.某结点的 ...
- 线段树——思维(Codeforces 339D Xenia and Bit Operations/Billboard HDU - 2795)
Codeforces 339D Xenia and Bit Operations vj地址 题意:给出2的n次方个数,每次将现在这个序列中相邻的两个数运算后合并为一个数,得到一个新的序列,这个新序列的 ...
- Billboard(海报粘贴简单的线段树)
题目来源:[NWPU][2014][TRN][13]线段树第一讲 G 题 http://vjudge.net/contest/view.action?cid=50850#problem/G 作者:n ...
- hdu2795 线段树应用:找到线段树中=给定值的第一个元素位置 并 更新该点)
问题描述 在大学的入口处,有一个巨大的矩形广告牌,大小为h * w(h是它的高度,w是它的宽度).董事会是发布所有可能公告的地方:最近的节目比赛,餐厅菜单的变化以及其他重要信息. 9月1日,广告牌 ...
- 数据结构---线段树
线段树 转载请注明出处,谢谢!http://blog.csdn.net/metalseed/article/details/8039326 持续更新中··· 一:线段树基本概念 1:概述 线段树 ...
最新文章
- Java项目:在线小说阅读系统(读者+作者+管理员)(java+SSM+jsp+mysql+maven)
- Java中一个令人惊讶的bug
- vue嵌套数据多层级里面的数据不自动更新渲染dom
- 浅谈 Linux 高负载的系统化分析
- 炫界 (978) -(建工发现应用克隆漏)_除了DMA,这些漏损点检测与漏损区域识别技术你知道么?...
- node mysql商城开发_GitHub - Ssipon/nideshop: NideShop:基于Node.js+MySQL开发的开源免费商城(api服务器端)...
- ireport 生成一维码 和 二维码 小记
- 1133 Splitting A Linked List
- WPF 视频教程+笔记
- 如何拆分复杂需求的用户故事?这些必杀技GET
- U813.0 - 登录系统管理提示“缺少根元素”
- 数控铣削图案及编程_数控铣削编程与操作设计有全套图纸.doc
- 助你迈向成功之路的二十二个好习惯
- MAR位数反映存储单元的个数笔记
- 本大三狗处博——为工作消得人憔悴
- 北航计算机组成原理课程设计-2020秋 【系列完结】Verilog或ISE高级特性与自动化测试
- Go 语言高质量编程
- java发邮件的代码
- CS信号(片选信号)经常都是低电平有效
- IntelliJ Idea -- 自动引包设置
热门文章
- Map map = request.getParameterMap(); BeanUtils.populate(bean, map);对前端表单的迅速封装与判断
- 一个链表创建、反转、打印的C语言代码
- PX4飞控之导航及任务架构
- Linux DMA 内存拷贝与memcpy 速率比较
- php拉图片 图片变形,请大神帮我看这个图片变形公式
- 同一类的不同对象,在调用相同的成员函数时,入口地址是相同的
- Linux下.rar文件解压
- javascript读写本机文本文件
- 如何使用Proxy模式及Java内建的动态代理机制
- Pro *C/C++学习笔记