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值,这些是公告的尺寸. 贴公告 ...
随机推荐
- mysql合并结果集
- Codeforces Round #611 (Div. 3)
原题面:https://codeforces.com/contest/1283 A.Minutes Before the New Year 题目大意:给定时间,问距离零点零分还有多久? 分析:注意一下 ...
- Adapter之ArrayAdapter以及监听器设置
前言: ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字~,我的学习就是通过这个最简单的适配器开始 正文: 完成这个ArrayAdapter需要三步:1.初始化数据 ...
- 矿难已经过去,NVIDIA将高举光追大旗!
在去年8月推出支持光线追踪技术的Turing图灵GPU之前,显卡市场差不多沉沦了两年,很大一个原因就是2017到2018年初的数字货币市场爆发,矿卡市场取代了游戏卡市场成为增长点,那一年多显卡厂商的日 ...
- python 首先生成包含1000个随机字符的字符串,然后统计每个字符的出现次数
题目:首先生成包含1000个随机字符的字符串,然后统计每个字符的出现次数 import string import random x = string.ascii_letters + string.d ...
- Vulkan 之 Layers
Layers 暴露给api层,不像传统图形API集成在驱动里面,开发者根据自己的需要进行开启,最终目的还是为了提高性能. The Loader he loader is the central arb ...
- Java中如何序列化一个对象(转)
转自:http://blog.csdn.net/chx10051413/article/details/40784667 http://www.cnblogs.com/baoendemao/p/380 ...
- 报错SQL盲注之BIGINT 溢出
首先感谢原创博主,在此致敬.本文转自:http://www.cnblogs.com/lcamry/articles/5509112.html MySQL版本在 5.5.5 及其以上 0x01 概述 我 ...
- 二、【未来】React环境安装:npx
搭建React的开发环境的第二种方法(新-未来推荐): https://reactjs.org/docs/create-a-new-react-app.html 一. npx简介: 1. npm v5 ...
- ELK 安装Beat
章节 ELK 介绍 ELK 安装Elasticsearch ELK 安装Kibana ELK 安装Beat ELK 安装Logstash Beat是数据采集工具,安装在服务器上,将采集到的数据发送给E ...