参考:  https://blog.csdn.net/qiqi_skystar/article/details/49073309
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2795
这个是对宽度建立线段树,每次更新这一行,一个区间的最大剩余宽度;
题目大意:有一块尺寸为h*w的矩形长板,要在上面贴1 * w【i】的海报n张。海报贴的位置要尽量靠左,如果一行能够填满就填满,最后输出的是这张海报贴的高度位置(就是在第几行)。
 
解题思路:
用高度进行建树,每一次比较宽度,在结构体里面定义一个mmax来表示最大的宽度,这个宽度在Updata()这个函数中不断地更新。一直不断的将左右儿子的最大值反馈到父亲结点。
 
特别注意:1、如果高度是5,但是有2个海报,这样我们就不需要建高度为5的树了,现在看来没有特别大的区别,但是题目中给的数据是1 <= h,w <= 10^9; 1 <= n <= 200,000~~,也就是说n最大是200000;
     2、这个题目要求输出的是你更新的位置,所以就可以少一个查找的函数。再更新的函数里面,如果这个位置更新了,就可以直接输出这个位置就OK了。
     3、一定要先比较左结点,在比较右结点。左不行在考虑右。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 2e5+;
int h,w,n; struct node {
int l,r;
int mwit;
}s[maxn*];
void initTree(int l,int r,int k)
{
s[k].l = l,s[k].r = r;
s[k].mwit = w;
if(l==r)return;
int mid = (l+r)>>;
initTree(l,mid,k*);
initTree(mid+,r,k*+);
}
void update(int l,int r,int k,int x)
{
if(l==r)
{
printf("%d\n",l);
s[k].mwit -= x;
return;
}
int mid = (l+r)>>;
if(x <= s[k*].mwit)
update(l,mid,k*,x);
else update(mid+,r,k*+,x); s[k].mwit = max(s[k*].mwit , s[k*+].mwit);
}
int main(){
while(~scanf("%d%d%d",&h,&w,&n))
{
if(h>n)h=n; //这步比较重要,因为h<=1e9;而n<=2e5;由题意可得行数不会超过海报的个数;
initTree(,h,);
while(n--)
{
int x;
scanf("%d",&x);
if(x <= s[].mwit )
{
update(,h,,x);
}
else puts("-1");
}
}
return ;
}

HDU-2795Billboard+对宽度建立线段树的更多相关文章

  1. HDU 4031 Attack(离线+线段树)(The 36th ACM/ICPC Asia Regional Chengdu Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4031 Problem Description Today is the 10th Annual of ...

  2. HDU 1166 敌兵布阵 线段树的基本应用——动态区间和问题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=1166 简单题,1A了,这个好像就是传说中的“点树”. 设当前结点表示线段[left, right],编号 ...

  3. [LintCode] Segment Tree Build 建立线段树

    The structure of Segment Tree is a binary tree which each node has two attributes start and end deno ...

  4. HDU 1698 Just a Hook(线段树成段更新)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  5. hdu 4417 Super Mario 离线线段树

    思路:将点按值从小到大排序,询问按h从小到大排序. 在建立线段树,按h的大小更新树并得到该次查询的结果! 代码如下: #include<iostream> #include<stdi ...

  6. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  7. hdu 1166 敌兵布阵(线段树详解)

    Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...

  8. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  9. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

随机推荐

  1. web安全脑图

  2. Linux零拷贝技术,看完这篇文章就懂了

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,欢迎大家关注,二维码文末可以扫. 本文讲解 ...

  3. Hexo结合github制作博客

    https://blog.csdn.net/Hoshea_chx/article/details/78826689 hexo(themes) vuePress jekylly

  4. 01-Spring Security框架学习

    目录 01-Spring Security框架学习 简介 Spring Security 是什么 Spring Security 解决那些问题 Spring Security 的优点 历史背景 Spr ...

  5. Usaco Training [2.1] The Castle 搜索

    传送门 题目的输出的4个信息 前两个很容易,dfs,bfs都可以,图怎么建都可以 后两个在搜索的时候记录belong[i][j]和已有的size即可 代码应该比不少题解清晰吧 #include < ...

  6. java并发编程(二十三)----(JUC集合)ConcurrentSkipListMap介绍

    ConcurrentSkipListMap提供了一种线程安全的并发访问的排序映射表.内部是SkipList(跳表)结构实现,在理论上能够在O(log(n))时间内完成查找.插入.删除操作. 理解Ski ...

  7. android ——ListView

    谷歌官方文档的介绍:https://developer.android.com/reference/android/widget/ListView.html 显示可垂直滚动的视图集合,其中每个视图都立 ...

  8. xtuils

    xutils的使用必须导入一个依赖 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS ...

  9. postman 测试http,接口

    1.form-data: 就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件.当上传的字段是文件时 ...

  10. 汇总VSCode中比较好用的插件

    使用vscode编辑器两年的时间,总结出前端一些比较方便的插件 1. Auto Close Tag 自动添加HTML / XML关闭标签 2. Auto Complete Tag 自动完成标签 3 A ...