hdu 2975 Billboard
2015-08-23 20:53
411 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2795
解题思路:
题目大意:
有一块h*w的矩形广告板,要往上面贴广告; 然后给n个1*wi的广告,要求把广告贴上去; 而且要求广告要尽量往上贴并且尽量靠左; 求
第n个广告的所在的位置,不能贴则为-1。
算法思想:
利用线段树可以求区间的最大值,将位置即h用来建树(h<=n,大了没有意义),树中存储的为该位置还拥有的空间,若左子树的最大值
大于他,就查询左子树,否则查询右子树。
AC代码:
http://acm.hdu.edu.cn/showproblem.php?pid=2795
解题思路:
题目大意:
有一块h*w的矩形广告板,要往上面贴广告; 然后给n个1*wi的广告,要求把广告贴上去; 而且要求广告要尽量往上贴并且尽量靠左; 求
第n个广告的所在的位置,不能贴则为-1。
算法思想:
利用线段树可以求区间的最大值,将位置即h用来建树(h<=n,大了没有意义),树中存储的为该位置还拥有的空间,若左子树的最大值
大于他,就查询左子树,否则查询右子树。
AC代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int N = 200005; struct node{ int l,r; int num; }tree[N<<2]; int h,w,n; void build(int id,int l,int r){ tree[id].l = l; tree[id].r = r; tree[id].num = w; if(l == r) return ; int mid = (l+r)>>1; build(id<<1,l,mid); build(id<<1|1,mid+1,r); } int query(int id,int len){ if(tree[id].l == tree[id].r){ tree[id].num -= len; return tree[id].l; } else{ int sum1 = 0,sum2 = 0; if(len <= tree[id<<1].num) sum1 = query(id<<1,len); else if (len <= tree[id<<1|1].num) sum2 = query(id<<1|1,len); tree[id].num = max(tree[id<<1].num,tree[id<<1|1].num); return sum1+sum2; } } int main(){ while(~scanf("%d%d%d",&h,&w,&n)){ if(h > n) h = n; build(1,1,h); int x; for(int i = 1; i <= n; i++){ scanf("%d",&x); if(tree[1].num >= x) printf("%d\n",query(1,x)); else printf("-1\n"); } } return 0; }
相关文章推荐
- 黑马程序员——27,正则表达式
- 一切从Markdown开始
- iOS项目开发实战——学会使用TableView列表控件(四)plist读取与Section显示
- 线性同余方程组模板
- 上楼梯问题的解法
- android 自定义对话框
- java中hex转byte问题
- Feel Good(单调栈(比之前更加完善的模板))
- 【java开发】方法重写和方法重载概述
- Hibernate缓存
- 深入浅出PHP(Exploring PHP)
- 编程学习笔记之D语言(一)
- Linux命令详解(2):pwd
- CCActionInstant源码解析
- Office 2013 Pro Plus Vol激活
- CF#317D dp
- java实现ArrayList LinkedList 和迭代器
- IntelliJ IDEA启动Tomcat后,却无法访问Tomcat首页?
- 【javascript】Ajax核心-XMLhttpRequest
- 清除行列(Java)