HDU 2795 Billboard 线段树活用
题目大意:在h*w 高乘宽这样大小的 board上要贴广告,每个广告的高均为1,wi值就是数据另给,每组数组给了一个board和多个广告,要你求出,每个广告应该贴在board的哪一行,如果实在贴不上,就输出-1;
这个题目也难以想到居然是用线段树来做
我们需要考虑的是,线段树究竟表示的是什么数据。在这个题目里,由于每个广告的高都为1,是不是好像感觉每一行都是一个叶子节点一样。没错,就是这样。。。化抽象为具体一点,那就是把这个board给竖起来,这样最底部的孩子存贮了当前行的空闲宽度,每个父节点都是左右孩子的max。
其实思路这样理一下,感觉其实很简单,是把。
还要注意的一点是,虽然题目说h 和 w高达10的九次方,但并不意味着我线段树要建如此大(事实上真要建也建不了),由于广告最多只有200000个,所以,你想,底层叶子最多,也就每个广告占一行,那也就是这么大。。。因此线段树的大小真心不能只看表面
#include <iostream>
#include <cstdio>
#include <cstring>
#define Lson (x<<1),l,mid
#define Rson (x<<1|1),mid+1,r
#define maxn 200005
using namespace std;
int d[maxn*];
int max(int a,int b)
{
return a>b ? a:b;
}
void getup(int x)
{
d[x]=max(d[x<<],d[x<<|]);
}
void build (int wid,int x,int l,int r)
{
if (l==r){d[x]=wid;return;}
int mid=(l+r)/;
build(wid,Lson);
build(wid,Rson);
getup(x);
}
/*void update(int a,int x,int l,int r)
{
if (l==r)
{
d[x]-=a;
}
int mid=(l+r)/2;
if (a<=d[x<<1]) update(a,Lson);
else update(a,Rson);
getup(x);
}*/
int query(int a,int x,int l,int r)
{
if (l==r)
{
if (d[x]<a) return -;//此时根本就贴不上
else {d[x]-=a;return l;}
}
int mid=(l+r)/;
int ret=;
if (a<=d[x<<]) ret=query(a,Lson);
else ret=query(a,Rson);
if (ret>) getup(x);//及时更新父节点
return ret;
}
int main()
{
int h,wid,q;
while (scanf("%d %d %d",&h,&wid,&q)!=EOF)
{
if (h>q) h=q;//注意h过大的时候,以广告数q为宗旨。
build(wid,,,h);
int i,j;
for (i=;i<=q;i++)
{
int a;
scanf("%d",&a);
int ans=query(a,,,h);
printf("%d\n",ans);
//if (ans!=-1)
//update(a,1,1,h);
}
}
return ;
}
HDU 2795 Billboard 线段树活用的更多相关文章
- hdu 2795 Billboard 线段树单点更新
Billboard Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=279 ...
- HDU 2795 Billboard (线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题目大意:有一块h*w的矩形广告板,要往上面贴广告; 然后给n个1*wi的广告,要求把广告贴 ...
- HDU 2795 Billboard (线段树+贪心)
手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/article/details/77488127 URL: http ...
- [HDU] 2795 Billboard [线段树区间求最值]
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2795 Billboard 线段树,区间最大值,单点更新
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- ACM学习历程—HDU 2795 Billboard(线段树)
Description At the entrance to the university, there is a huge rectangular billboard of size h*w (h ...
- HDU 2795 Billboard (线段树单点更新 && 求区间最值位置)
题意 : 有一块 h * w 的公告板,现在往上面贴 n 张长恒为 1 宽为 wi 的公告,每次贴的地方都是尽量靠左靠上,问你每一张公告将被贴在1~h的哪一行?按照输入顺序给出. 分析 : 这道题说明 ...
- hdu 2795 Billboard 线段树+二分
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧)
HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧) 题意分析 题目大意:一个h*w的公告牌,要在其上贴公告. 输入的是1*wi的w值,这些是公告的尺寸. 贴公告 ...
随机推荐
- tornado结合前端进行文件上传
在表单中我们获取用户提交的数据,使用的是get_argument,复选框使用的是get_arguments,但是文件的不一样,文件的使用request.files. form文件上传 html代码: ...
- log4j配置文件——hibernate
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j ...
- MFC 状态栏的使用 CstatusBar
你在源文件头文件声明一下 CStatusBar zhuangtailan; 然后在窗口初始化添加以下代码 zhuangtailan.Create(this);//意思是在本窗口创建 UINT id ...
- python 4个人中有一人做了好事,一直有三个人说了真话,根据下面的对话判断是谁做的好事
题目:4个人中有一人做了好事,一直有三个人说了真话,根据下面的对话判断是谁做的好事. A:不是我 B:是C C:是D D:C胡说 for inum in ['A','B','C','D']: prin ...
- Windows平台整合SpringBoot+KAFKA__第2部分_代码编写前传
开始准备写测试代码 看半天不太懂(我也算是小白级别的,看我搞windows版本的kafka就知道了), 看文档无聊,偶然看到一个KAFKA的windows管理程序,于是就试试就装了一个,感觉那个玩意也 ...
- 157-PHP strrchr函数输出最后一次出现字母p的位置到字符串结尾的所有字符串
<?php $str='PHP is a very good programming language!'; //定义一个字符串 echo strrchr($str,'o'); //输出最后一次 ...
- C#使用throw和throw ex的区别(转)
使用throw和throw ex的区别 之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查, ...
- s曲线
一. 原型 sigmoid 函数原型: 在 [-5, 5] 上的曲线是这个样子的: 二.X轴变形 如果我们希望加速更快一点,那么就需要对原型中的指数 -X 的系数进行改变.原型可以认为是 -(1 * ...
- 【LGR-(-8)】洛谷入门赛 #5 题解
比赛链接 9道题. 注:题目名称中链接为题目链接,题号中链接为比赛内链接 题目编号 洛谷题号 题目名称 题目难度 A P5713 [深基3.例5]洛谷团队系统 \(\color{red}{入门}\) ...
- 2016蓝桥杯省赛C/C++A组第八题 四平方和
题意: 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + 2^ ...