问题描述

在大学的入口处,有一个巨大的矩形广​​告牌,大小为h * w(h是它的高度,w是它的宽度)。董事会是发布所有可能公告的地方:最近的节目比赛,餐厅菜单的变化以及其他重要信息。

9月1日,广告牌是空的。一个接一个,公告开始被放在广告牌上。

每个公告都是单位高度的纸条。更具体地,第i个通告是大小为1 * wi的矩形。

当有人在广告牌上发布新的公告时,她总是会选择公告的最高位置。在所有可能的最高职位中,她总是选择最左边的职位。

如果新公告没有有效位置,则不会将其放在广告牌上(这就是为什么某些编程竞赛没有来自该大学的参与者)。

根据广告牌和公告的大小,您的任务是查找公告所在的行数。

输入

有多种情况(不超过40例)。

输入文件的第一行包含三个整数,h,w和n(1 <= h,w <= 10 ^ 9; 1 <= n <= 200,000) - 广告牌的尺寸和公告数量。

接下来的n行中的每一行包含整数wi(1 <= wi <= 10 ^ 9) - 第i个通告的宽度。

产量

对于每个公告(按输入文件中给出的顺序)输出一个数字 - 放置此公告的行号。从第一行开始,行从1到h编号。如果无法在广告牌上刊登公告,请为此公告输出“-1”。

样本输入
3 5 5
2
4
3
3
3样本输出
1
2
1
3
-1

分析:

建立一颗线段树,线段树维护的每个元素(不是指树的节点哦)代表广告牌的一行的当前剩余最大空间maxv。比如i节点维护区间[l,r],那么k(l<=k<=r)代表广告牌的第k行。即maxv[i]就是i节点维护的广告牌的那些行中,剩余空间的最大值。

其中线段树中节点维护的信息是:本节点控制的区间[L,R]内的叶节点的最大剩余空间maxv[i]。如果maxv[i]>wi说明这个节点的子树有叶子能放下wi,优先往左子树找即可.

代码:

<span style="font-size:18px;"><span style="font-size:18px;">#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int H,W,n,Q;
const int MAXN=200000+100;
int maxv[MAXN*4];
int id[MAXN*4];
int cnt;
#define lson i*2,l,m
#define rson i*2+1,m+1,r
void PushUp(int i)
{maxv[i]=max(maxv[i*2] , maxv[i*2+1]);
}
void build(int i,int l,int r)
{if(l==r){maxv[i]=W;id[i]=++cnt;return ;}int m=(l+r)/2;build(lson);build(rson);PushUp(i);
}
int update(int w,int i,int l,int r)  //这里的跟新就是找到大于等于w的最小的那个叶节点。
{if(w>maxv[i])return -1;if(l==r){maxv[i]-=w;return id[i];}int res=-1;int m=(l+r)/2;if(maxv[i*2]>=w)res = update(w,lson);//这里优先考虑左子树。else if(maxv[i*2+1]>=w)res= update(w,rson);PushUp(i);return res;
}
int main()
{while(scanf("%d%d%d",&H,&W,&Q)==3){cnt=0;n = min(Q,H);//线段树叶节点的最大数目build(1,1,n);for(int i=1;i<=Q;i++){int w;scanf("%d",&w);printf("%d\n",update(w,1,1,n));}}return 0;
}</span></span>

hdu2795 线段树应用:找到线段树中=给定值的第一个元素位置 并 更新该点)相关推荐

  1. 线段树线段树的创建线段树的查询单节点更新区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...

  2. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2271  Solved: 935 [Submit][St ...

  3. 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解

    题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...

  4. 势能线段树/吉司机线段树-我没有脑子

    势能线段树/吉司机线段树 BZOJ3211 花神游历各国 BZOJ5312 冒险 BZOJ4355 Play with sequence BZOJ4695 最假女选手 \(A_i = max(A_i, ...

  5. 【XSY3490】线段树(广义线段树,树上莫队)

    题面 线段树 题解 本题分两 Part 走. Part 1 我们需要解决: 如何在广义线段树上快速区间定位节点. 对于有 nnn 个叶子节点.共 2n−12n-12n−1 个节点的广义线段树 AAA, ...

  6. 线段树和zkw线段树

    作者作为一个蒟蒻,也是最近才自学了线段树,不对的地方欢迎大佬们评论,但是不要喷谢谢 好啦,我们就开始说说线段树吧 线段树是个支持区间操作和查询的东东,平时的话还是蛮实用的 下面以最基本的区间加以及查询 ...

  7. hdu4747 线段树区间修改值,区间查询和及最大值即最大值位置

    很久以前就看到过这个题目,当时刚学线段树看了题解还是感觉敲不出来. 现在重新做这道题目感觉思路很难想到,代码量也不小,加深了对lrj大白书中pushdown和maintain的理解. 预处理从1开始到 ...

  8. uestc 1073 秋实大哥与线段树 Label:线段树

    秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) "学 ...

  9. BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)

    题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...

最新文章

  1. dotnet安装包时找不到依赖关系_孩子总找妈妈,小心单方父母过渡依赖症,4个方法让父母更平等...
  2. 【JFreeChart】JFreeChart—输出时序图
  3. 多线程编程(9) - 认识等待函数 WaitForSingleObject
  4. android icu4c 7.1编译报错,android4.0编译系统时候遇到的错误集
  5. Day03『NLP打卡营』实践课3:使用预训练模型实现快递单信息抽取
  6. 中断函数 printf_嵌入式中断服务函数的一些特点
  7. linux shell之case用法
  8. vscode we cannot connect_秋季常规赛分秒必争,PC BET直播:TES能否拿下西安WE
  9. DHCP报文分析及C/C++代码实现
  10. 安规的XY电容器件作用
  11. 【回炉重造系列】之Spring AOP简介
  12. Jaspersoft Studio 创建简单报表
  13. android手表微信运动,oppo智能手表微信运动如何安装
  14. TabWidget当前标签底线颜色
  15. Kylin - 框架介绍
  16. java-php-python-ssm文献管理平台计算机毕业设计
  17. 让你在 API 设计中少踩坑的实战分享
  18. 读书笔记--《软技能-代码之外的生存指南》
  19. macOS 与 iOS 中的 Tagged Pointer
  20. 绝地大逃杀官方指定迅游加速

热门文章

  1. 通过宠物商店理解java面向对象
  2. Java 中代码优化的 30 个小技巧(中)
  3. SWFUpload上传指南
  4. from .cv2 import * ImportError: libGL.so.1: cannot open shared object file: No such file or direc
  5. 四轴平面机器人的手眼标定
  6. 机器学习中的线性代数之矩阵求导
  7. 大学计算机专业找对象,单身率最高的大学专业是什么?这5个专业为什么成脱单最难专业...
  8. 5 win10 python3.6+pcl1.9环境配置
  9. 使用FTPClient封装FtpUtil
  10. 卷积神经网络前向及反向传播过程数学解析