博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-2795-Billboard
阅读量:7015 次
发布时间:2019-06-28

本文共 1389 字,大约阅读时间需要 4 分钟。

链接:

题意:

在学校的入口处有一个巨大的矩形广告牌,高为h,宽为w。所有种类的广告都可以贴,比如ACM的广告啊,还有餐厅新出了哪些好吃的,等等。。
 
在9月1号这天,广告牌是空的,之后广告会被一条一条的依次贴上去。
 
每张广告都是高度为1宽度为wi的细长的矩形纸条。
 
贴广告的人总是会优先选择最上面的位置来帖,而且在所有最上面的可能位置中,他会选择最左面的位置,而且不能把已经贴好的广告盖住。

 

如果没有合适的位置了,那么这张广告就不会被贴了。
 
现在已知广告牌的尺寸和每张广告的尺寸,求每张广告被贴在的行编号。

思路:

线段树,以行数建树,每个位置对应当前行所剩的最大的空间。

将最大空间记录。

优先往左边查找大的空间。直到找到,同时找到后更新最大值。

代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const int MAXN = 2e5 + 10;int segment[MAXN*4];int a[MAXN];int h, w, n;void Build(int root, int l, int r){ segment[root] = w; if (l == r) return; int mid = (l+r)/2; Build(root<<1, l, mid); Build(root<<1|1, mid+1, r);}int Query(int root, int l, int r, int v){ if (l == r) { segment[root] -= v; return l; } int mid = (l+r)/2; int res = 0; if (segment[root<<1] >= v) res = Query(root<<1, l, mid, v); else res = Query(root<<1|1, mid+1, r, v); segment[root] = max(segment[root<<1], segment[root<<1|1]); return res;}int main(){ while (~scanf("%d%d%d", &h, &w, &n)) { if (h > n) h = n; Build(1, 1, h); int v; for (int i = 1;i <= n;i++) { scanf("%d", &v); if (segment[1] < v) printf("-1\n"); else printf("%d\n", Query(1, 1, h, v)); } } return 0;}

  

转载于:https://www.cnblogs.com/YDDDD/p/10674639.html

你可能感兴趣的文章
运算放大器[二] -----基础
查看>>
在PyQt4中使用matplotlib
查看>>
c程序设计语言第一章2
查看>>
java_jstl 标签库
查看>>
「洛谷P1402」酒店之王 解题报告
查看>>
「学习笔记」ST表
查看>>
Django学习(三) Django模型创建以及操作
查看>>
Memcache和Redis
查看>>
windows乱码
查看>>
Solr与Elasticsearch比较
查看>>
缓存穿透和雪崩
查看>>
ACCESS_ONCE
查看>>
c++11特性使用
查看>>
setTimeout使用闭包功能,实现定时打印数值
查看>>
【单调队列】滑动窗口
查看>>
C# Redis使用之StackExchange
查看>>
C# 获得本机IP、端口等信息地址以及服务器IP信息
查看>>
在C#中的operator重载操作符
查看>>
FortiGate安全策略说明
查看>>
HDU3127 WHUgirls
查看>>