题目链接:点击查看

题目大意:给定一个高度为h,宽度为w的广告牌,接下来以此给出n个高度为1,宽度为w的广告,我们需要将广告优先贴在最上边、最左边,问给出的每一个广告应该贴在哪一行,若没有位置贴了则输出-1

题目分析:这个题一开始分析的是线段树,然后以h和n的最小值建树,因为假如h特别大,那么n个广告即使一行一个最多也才需要n行,剩下的n+1行到h行都浪费了,反过来也一样,如果h特别小,那么n个广告肯定也贴不下,所以我们要选n和h的较小值来建树。下面我们应该分析怎样建树,就是线段树中应该储存什么,我一开始想的是储存剩余的空间,然后求区间和处理,但是顺着想下去发现没有办法判断具体是哪一个区间满足条件,也有可能顺着递归下去却发现没有答案,这可把我难受坏了,后来憋不住了,去网上看了题解才发现这是个很简单的裸的最大值的线段树,随后一想确实是这个样子,但是为什么自己想的时候却想不到呢?不过总体思路就是维护一个最大值的线段树了,上代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<cmath>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e5+100;int h,w,n;struct Node
{int l,r,max;
}tree[N<<2];void build(int k,int l,int r)
{tree[k].l=l;tree[k].r=r;tree[k].max=w;if(l==r)return;int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);
}int query(int k,int val)
{if(tree[k].max<val)return -1;if(tree[k].l==tree[k].r){tree[k].max-=val;return tree[k].l;}int ans;if(tree[k<<1].max>=val)ans=query(k<<1,val);elseans=query(k<<1|1,val);tree[k].max=max(tree[k<<1].max,tree[k<<1|1].max);return ans;
}int main()
{
//    freopen("input.txt","r",stdin);while(scanf("%d%d%d",&h,&w,&n)!=EOF){if(h>n)h=n;build(1,1,h);while(n--){int x;scanf("%d",&x);printf("%d\n",query(1,x));}}return 0;
}

HDU - 2795 Billboard(线段树)相关推荐

  1. HDU 2795 Billboard (线段树+贪心)

    HDU 2795 Billboard (线段树+贪心) 手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/articl ...

  2. HDU 5861 Road 线段树区间更新单点查询

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...

  3. hdu 3308 LCIS 线段树 + 区间合并

    传送门 文章目录 题意: 思路: 题意: 思路: 日常水一篇题解. 带修改的求区间连续的递增序列,我们考虑用线段树维护. 直接维护mlenmlenmlen是区间最长的递增序列,lslsls是从左端点开 ...

  4. hdu 4747 mex 线段树+思维

    http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...

  5. hdu 1542 Atlantis (线段树+扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...

  6. YJJ's Salesman HDU - 6447(线段树 单点更新+DP思想)

    YJJ's Salesman 题目链接:HDU - 6447 题意:一个1e9*1e9的地图,要求由(0, 0) -> (1e9, 1e9):只能向下,向右, 向右下移动:地图中有n个点,有宝藏 ...

  7. HDU 4288 Coder [线段树]

    维护一个可以插入删除的有序序列,每次询问序列中位置mod5=3的数的和. CodeForces原题,因为时限给的太宽,数据太水,STL可以暴力过. 用线段树和平衡树都可以做这题,线段树需要先离散化,然 ...

  8. hdu 1540(线段树单点更新 区间合并)

    解题思路:这一题要求的是连续区间,所以可以把它的子区间合并,这里运用线段树,但是在保存节点信息的方面要做一点修改 lsum:从这个区间的左端点往右能够找到的最大连续区间: rsum:从这个区间的右端点 ...

  9. hdu 1255(线段树求重叠面积)

    扫描线求矩形重叠面积:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html http://www.tuicool.co ...

最新文章

  1. 【noi 2.5_8465】马走日(dfs)
  2. js基础篇——localStorage使用要点
  3. 【LeetCode】3月28日打卡-Day13
  4. 分享实录 | 企业CICD规模化落地浅析
  5. notepad++配置Zen Coding
  6. 计算机组成原理 第五章 中央处理器
  7. java笔试必考知识_面试必备:常考Java基础知识总结(持续更新)
  8. JavaParse入门
  9. Java根据出生日期计算(判断)星座
  10. 一分钟了解光纤、单模光纤、多模光纤
  11. 基于python语言设计的词云定制器
  12. 从外包月薪5K到阿里月薪15K,大厂面试必备技能
  13. css好看常用的中文字体
  14. 再探矩阵求逆引理 : Woodbury恒等式的证明
  15. 绘声绘影导出视频过大
  16. CODING 敏捷实战系列课第三讲:可视化业务分析
  17. 魔乐科技安卓开发教程----李兴华----03菜单
  18. 远程连接工具---mstsc单文件版兼容64位
  19. steam下载地址,千万别搞错!
  20. Android : Resource is not a Drawable (color or path)

热门文章

  1. explain 之key rows extra
  2. RPC创建API 模块
  3. 添加tomcat7插件设置jdk编译版本
  4. 类加载的双亲委派机制
  5. MapReduce案例-wordcount-JobMain代码
  6. HDFS的块缓存和访问权限
  7. jwt:token的解析
  8. 分隔线演练-增加多行分隔线函数的参数
  9. 日期和时间 - Java处理日期和时间
  10. mysql导入多条数据语句_MySQL插入多条记录和REPLACE语句