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

hhanger大神的题目,水题都得有点思维。

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

技巧挺好,一开始自己思路建个超大二维数组,显然内存不够。

然后。  线段树的话其实就是深搜,if(l==r) 返回的肯定是最左边的结点,哈~

判断的时候直接用Max[1]与p比较就能判断是否输出-1,赞一个!!

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std; #define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r int h,w,n; const int maxn=200005;// 是200000还是20000要搞清楚
int Max[maxn<<2]; //开maxn的多少倍结合最底层的结点数加以注意 void Pushup(int rt)
{
Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
void build(int rt,int l,int r)
{
Max[rt]=w;
if(l==r) return;
int m=(l+r)>>1;
build(lson);
build(rson);
}
int query(int p,int rt,int l,int r)//技巧5 . update放在query里面了
{
if(l==r)
{
Max[rt]-=p;
return l;// 2. 返回行数
} int m=(l+r)>>1;
int ret;
ret=(Max[rt<<1]>=p)?query(p,lson):query(p,rson);// 技巧1.这地方深搜返回最左边的结点即符合的。
Pushup(rt);// 技巧4 . 自己写这个地方有可能会忘
return ret;
} int main()
{
while(scanf("%d%d%d",&h,&w,&n)!=EOF)
{
if(h>n) {h=n;}
build(1,1,h); int p;
for(int i=1;i<=n;i++)
{
scanf("%d",&p);
if(Max[1]<p) printf("-1\n"); // 技巧3.Max[1]最根结点一定是最大值
else
{
int ans=query(p,1,1,h);
printf("%d\n",ans);
}
}
}
return 0;
}

HDU2795 billboard【转化为线段树。】的更多相关文章

  1. BNU 28887——A Simple Tree Problem——————【将多子树转化成线段树+区间更新】

    A Simple Tree Problem Time Limit: 3000ms Memory Limit: 65536KB This problem will be judged on ZJU. O ...

  2. ACM: Billboard 解题报告-线段树

     Billboard Time Limit:8000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descript ...

  3. [CERC2017]Intrinsic Interval——扫描线+转化思想+线段树

    [CERC2017]Intrinsic Interval https://www.luogu.org/blog/ywycasm/solution-p4747# 这种“好的区间”,见得还是比较多的了. ...

  4. 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)

    原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解    By 岩之痕 目录: 一:综述 ...

  5. bzoj2124 等差子序列(hash+线段树)

    2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 719  Solved: 261[Submit][Status][Discuss] ...

  6. 线段树(build,insert,dfs操作)

    模板原型: 解决零散数点在已知线段上的出现次数.思想是将线段用长线覆盖,将长线转化成线段树.用权值记录各个数点出现的次数,最后进行查询.代码解释见注释. #include <bits/stdc+ ...

  7. ●线段树的三个题(poj 3225,hdu 1542,hdu 1828)

    ●poj 3225 Help with Intervals(线段树区间问题) ○赘述题目 给出以下集合操作: 然后有初始的一个空集S,和以下题目给出的操作指令,并输入指令: 要求进行指令操作后,按格式 ...

  8. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  9. ZOJ 3686 A Simple Tree Problem(线段树)

    Description Given a rooted tree, each node has a boolean (0 or 1) labeled on it. Initially, all the ...

随机推荐

  1. ping时不知道ping那个Ip的解决办法

    利用命令:nslookup Windows+R键,输入CMD,输入命令nslookup www.baidu.com OK!这得在联网情况下,如果本身nslookup就不行的话,可不可以认为网络就不好使 ...

  2. WCF 接收、发送数据的大小及时间的设置

    <system.serviceModel> <bindings> <basicHttpBinding> <binding name="/> & ...

  3. git代码提交流程

    1.进入我的项目文件夹所在目录: 2.git status 查看我修改过的文件: 3.git add -A 将修改的文件全部添加, git add 文件名  只添加指定的文件名: 4.git comm ...

  4. java新特性之可变参数

    public class NewDemo01 {     public static void main(String[] args) {         System.out.print(" ...

  5. 十大最值得注意的MySQL变量

    MySQL数据库中的变量非常多,下文为您整理出了十大最值得注意的MySQL变量,希望对您学习MySQL数据库能够有一些帮助. AD: MySQL变量很多,其中有一些MySQL变量非常值得我们注意,下面 ...

  6. poj 3228 Gold Transportation 二分+网络流

    题目链接 给出n个城市, 每个城市有一个仓库, 仓库有容量限制, 同时每个城市也有一些货物, 货物必须放到仓库中. 城市之间有路相连, 每条路有长度. 因为有些城市的货物量大于仓库的容量, 所以要运到 ...

  7. pandas的札记

    导入导出数据 在导入,导出DataFrame数据时,会用到各种格式,分为 to_csv ;to_excel;to_hdf;to_sql;to_json;to_msgpack ;to_html;to_g ...

  8. 面试题之 query转为obj

    要注意处理编码后的字串  对于a=123要得到number形的值 function parseQueryString(url) { var obj = {}; var query = url.sear ...

  9. 【转】几个常用的Oracle存储过程

    http://blog.bossma.cn/database/some-oracle-storing-process/ 几个常用的Oracle存储过程 发布时间:2008年1月6日 / 分类:Data ...

  10. 动态链接库 DLL

    动态链接库DLL 不使用时不会有任何作用,只有在其他模块调用动态链接库中的函数时,它才发挥作用. 一.静态库与动态库 1.静态库 函数和数据被编译进一个二进制文件(.LIB),编译时,会将其组合起来创 ...