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

题目大意:有一个h*w的公告牌,要在其上贴公告。现在有n个公告,每个公告的尺寸为1*wi,即高度都为1,现在依次给出n个公告的宽度wi,需要求出每个公告在广告牌所在的行数。要求:对于同一个公告尽量贴在公告牌的上方,如果高度一致,尽量贴在广告牌的左侧。如果没有合适的位置,则输出-1.

例:

Sample Input
3 5 5
2
4
3
3
3
 
Sample Output
1
2
1
3
-1
 
解题思路:这个题目和ACM-ICPC 2018 南京赛区网络预赛 G Lpl and Energy-saving Lamps很类似,可以使用同一种思想。这里我们用线段树节点存储该区间内空位最大的那一行的空位长度,只要维护每个区间的最大值就可以了。然后每输入一个公告的宽度,先与树的根相比较,如果宽度大于树的根,肯定无法插入进去,所以直接输出-1,否则的话,就先与左子树相 比较,如果比它大,就查询左子树,否则查询右子树,查询之后再减去相应的长度即可。
 
然后这题有点要注意的是,树的叶子节点总个数应该是h个,然而如果h>n的话,叶子的个数应该为n个,因为多余的无意义了。
附上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
#define maxn 200005
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define pushup() tree[root]=max(tree[root<<1],tree[root<<1|1])
int tree[maxn<<];
int n,h,w,x; void build(int l,int r,int root)
{
if(l==r)
{
tree[root]=w;
return;
}
int mid=l+r>>;
build(lson);
build(rson);
pushup();
}
int query(int val,int l,int r,int root)
{
if(l==r)
{
tree[root]-=val;
return l;
}
int mid=l+r>>;
int ans;
if(val<=tree[root])
{
if(tree[root<<]>=val)
ans=query(val,lson);
else
ans=query(val,rson);
}
pushup();
return ans;
} int main()
{
while(~scanf("%d%d%d",&h,&w,&n))
{
if(h>n)
h=n;
build(,h,);
for(int i=;i<=n;i++)
{
scanf("%d",&x);
if(x>tree[])
printf ("%d\n",-);
else
printf("%d\n",query(x,,h,));
}
}
return ;
}

hdu2795(线段树)的更多相关文章

  1. hdu2795 线段树 贴广告

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. hdu2795 线段树

    //Accepted 6396 KB 3046 ms //线段树 //由于n只有200000,我们可以知道,当h>200000时,大于200000的部分是没有用的 //所以我们可以用n来创建线段 ...

  3. hdu2795线段树

    //=========================================== //segment tree //final version //by kevin_samuel(fenic ...

  4. hdu2795(线段树单点更新&区间最值)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题意:有一个 h * w 的板子,要在上面贴 n 条 1 * x 的广告,在贴第 i 条广告时要 ...

  5. HDU2795线段树入门 简单查询和修改

    http://acm.hdu.edu.cn/showproblem.php?pid=2795 #include<iostream> using namespace std; ; int h ...

  6. 线段树-hdu2795 Billboard(贴海报)

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

  7. HDU-------(2795)Billboard(线段树区间更新)

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. 【HDU2795】Billboard(线段树)

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

  9. 【线段树求最靠前】【HDU2795】【Billboard】

    题意: 有一个H*W的广告牌,当插入一个广告时(1*Wi),问最靠前的插入方式是什么 新生赛有个类似的题目,可惜当时居然没水过去. 果断用线段树做 以H为线段 建树,存[l,r]中最大的宽度,因为区间 ...

  10. HDU2795 billboard【转化为线段树。】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 hhanger大神的题目,水题都得有点思维. 题意:h*w的木板,放进一些1*L的物品,求每次放 ...

随机推荐

  1. switch变种玩法

    标准版本: switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; ... default: 语句体n+; break; } switch: ...

  2. PostgreSQL 安装了contrib 之后 登录失败的问题

    1. 自己之前只是安装了 pg 10.6 2. 开发同事 需要用到 一个extensions 叫做 uuid-ossp 3. 执行报错  详情见昨天的blog 4. 然后执行了升级操作 结果 pg10 ...

  3. 金蝶CLOUD与EAS的区别

    1.金蝶K/3 WISE主要面向单体制造企业(主要是离散制造企业):2.金蝶K/3 Cloud主要面向业务类型单一(即主营业务单一)的.注重供应链与生产业务协同的.中小型(二层集团??)集团性企业(主 ...

  4. synchronized无法禁止指令重排序的证明

    package demo.reorder; import java.util.concurrent.ExecutorService; import java.util.concurrent.Execu ...

  5. uname -r查询版本不是安装的版本的问题

    uname -r 查出来的版本与/lib/modules下面的内核版本不匹配.啥原因? 第一步,先strace uname -r看看这个uname -r到底从哪里获取的版本. strace没有看出来 ...

  6. 集合之HashSet(含JDK1.8源码分析)

    一.前言 我们已经分析了List接口下的ArrayList和LinkedList,以及Map接口下的HashMap.LinkedHashMap.TreeMap,接下来看的是Set接口下HashSet和 ...

  7. MySQL系列:索引基本操作(4)

    1. 索引简介 索引是一种特殊的数据库结构,可以用来快速查询数据中的特定记录. MySQL中索引包括:普通索引.唯一性索引.全文索引.单列索引.多列索引和空间索引等. 1.1 索引定义 索引由数据库表 ...

  8. E: Unable to correct problems, you have held broken packages

    问题: apt install libmysqlclient-dev Reading package lists... DoneBuilding dependency tree       Readi ...

  9. TField OnValidate 事件

    Occurs just before the data is written to the record buffer. Write an OnValidate event handler to va ...

  10. nginx rewrite重写

    通过官方文档可以看到,rewrite的作用上下文是   server location,可以写在 server里面  亦或location里面; 命令: if (条件) {} 条件判断 set #设置 ...