题目大意:在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 线段树活用的更多相关文章

  1. hdu 2795 Billboard 线段树单点更新

    Billboard Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=279 ...

  2. HDU 2795 Billboard (线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题目大意:有一块h*w的矩形广告板,要往上面贴广告;   然后给n个1*wi的广告,要求把广告贴 ...

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

    手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/article/details/77488127 URL: http ...

  4. [HDU] 2795 Billboard [线段树区间求最值]

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

  5. HDU 2795 Billboard 线段树,区间最大值,单点更新

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

  6. ACM学习历程—HDU 2795 Billboard(线段树)

    Description At the entrance to the university, there is a huge rectangular billboard of size h*w (h ...

  7. HDU 2795 Billboard (线段树单点更新 && 求区间最值位置)

    题意 : 有一块 h * w 的公告板,现在往上面贴 n 张长恒为 1 宽为 wi 的公告,每次贴的地方都是尽量靠左靠上,问你每一张公告将被贴在1~h的哪一行?按照输入顺序给出. 分析 : 这道题说明 ...

  8. hdu 2795 Billboard 线段树+二分

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

  9. HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧)

    HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧) 题意分析 题目大意:一个h*w的公告牌,要在其上贴公告. 输入的是1*wi的w值,这些是公告的尺寸. 贴公告 ...

随机推荐

  1. mysql合并结果集

  2. Codeforces Round #611 (Div. 3)

    原题面:https://codeforces.com/contest/1283 A.Minutes Before the New Year 题目大意:给定时间,问距离零点零分还有多久? 分析:注意一下 ...

  3. Adapter之ArrayAdapter以及监听器设置

    前言: ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字~,我的学习就是通过这个最简单的适配器开始 正文: 完成这个ArrayAdapter需要三步:1.初始化数据 ...

  4. 矿难已经过去,NVIDIA将高举光追大旗!

    在去年8月推出支持光线追踪技术的Turing图灵GPU之前,显卡市场差不多沉沦了两年,很大一个原因就是2017到2018年初的数字货币市场爆发,矿卡市场取代了游戏卡市场成为增长点,那一年多显卡厂商的日 ...

  5. python 首先生成包含1000个随机字符的字符串,然后统计每个字符的出现次数

    题目:首先生成包含1000个随机字符的字符串,然后统计每个字符的出现次数 import string import random x = string.ascii_letters + string.d ...

  6. Vulkan 之 Layers

    Layers 暴露给api层,不像传统图形API集成在驱动里面,开发者根据自己的需要进行开启,最终目的还是为了提高性能. The Loader he loader is the central arb ...

  7. Java中如何序列化一个对象(转)

    转自:http://blog.csdn.net/chx10051413/article/details/40784667 http://www.cnblogs.com/baoendemao/p/380 ...

  8. 报错SQL盲注之BIGINT 溢出

    首先感谢原创博主,在此致敬.本文转自:http://www.cnblogs.com/lcamry/articles/5509112.html MySQL版本在 5.5.5 及其以上 0x01 概述 我 ...

  9. 二、【未来】React环境安装:npx

    搭建React的开发环境的第二种方法(新-未来推荐): https://reactjs.org/docs/create-a-new-react-app.html 一. npx简介: 1. npm v5 ...

  10. ELK 安装Beat

    章节 ELK 介绍 ELK 安装Elasticsearch ELK 安装Kibana ELK 安装Beat ELK 安装Logstash Beat是数据采集工具,安装在服务器上,将采集到的数据发送给E ...