hdu 2795 段树--点更新
http://acm.hdu.edu.cn/showproblem.php?pid=2795
在第一和第三多学校都出现线段树,我在比赛中并没有这样做。,热身下,然后31号之前把那两道多校的线段树都搞了,这是一道热身题
关键是建模:
首先一定看清楚题目构造的场景,看有什么特点--------会发现。假设尽量往左上放置的话。那么因为 the i-th announcement is a rectangle of size 1 * wi.,全然能够对h建立线段树。表示一行。结点里的l,r就表示从l行到r行,每次插入都更新结点里的可用宽度,同一时候插入的时候记录行数即可
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; #define lson(i) (i)*2,l,mid
#define rson(i) ((i)*2+1),mid+1,r
#define ll rt*2
#define rr (rt*2+1) const int MAXN = 200000 +10;
int n,w,h;
struct Node
{
int l,r;
int up;
}nodes[MAXN*4]; void build(int rt, int l, int r)
{
nodes[rt].l=l;
nodes[rt].r=r;
nodes[rt].up=w;
if(l == r)return;
int mid=(l+r)/2;
build(lson(rt));
build(rson(rt));
}
int cnt;
int ans[MAXN];
void update(int rt,int v)
{
if(nodes[rt].l == nodes[rt].r)
{
nodes[rt].up-=v;
ans[cnt]=nodes[rt].l ;
return;
}
if(v<=nodes[rt*2].up)update(rt*2,v);
else update(rt*2+1,v);
nodes[rt].up=max(nodes[rt*2].up, nodes[rt*2+1].up);
} int main()
{
int y;
while(~scanf("%d%d%d",&h, &w, &n))
{
cnt=0;
h=min(h,n);
build(1,1,h);
memset(ans,-1,sizeof(ans));
for(int i=0;i<n;i++)
{
scanf("%d",&y);
if(nodes[1].up>=y)update(1,y);
cnt++;
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
}
return 0;
}
版权声明:本文博客原创文章。博客,未经同意,不得转载。
hdu 2795 段树--点更新的更多相关文章
- HDU 2795 线段树单点更新
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2795 (线段树 单点更新) Billboard
h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子. 每次找能放纸条而且是最上面的位置,询问完以后可以同时更新,所以可以把update和query写在同一个函数里. #include ...
- hdu 4267 线段树间隔更新
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDU 6356.Glad You Came-线段树(区间更新+剪枝) (2018 Multi-University Training Contest 5 1007)
6356.Glad You Came 题意就是给你一个随机生成函数,然后从随机函数里确定查询的左右区间以及要更新的val值.然后最后求一下异或和就可以了. 线段树,区间最大值和最小值维护一下,因为数据 ...
- hdu 1166线段树 单点更新 区间求和
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 计蒜客 28315.Excellent Engineers-线段树(单点更新、区间最值) (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 E)
先写这几道题,比赛的时候有事就只签了个到. 题目传送门 E. Excellent Engineers 传送门 这个题的意思就是如果一个人的r1,r2,r3中的某一个比已存在的人中的小,就把这个人添加到 ...
- POJ 1436.Horizontally Visible Segments-线段树(区间更新、端点放大2倍)
水博客,水一水. Horizontally Visible Segments Time Limit: 5000MS Memory Limit: 65536K Total Submissions: ...
- HDU 1698 线段树 区间更新求和
一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...
- HDU 4348 主席树区间更新
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
随机推荐
- 注册表 ControlSet001、ControlSet002以及CurrentControlSet
首先说说ControlSet几组控制之间的关系. 注册表HKLM\system注意 注册表项包含windows启动的三个控件组(额外还可能存在一个备份控件组).在初始状态下.它们各自是Con ...
- 章节2:SQL之多表连接
原文:章节2:SQL之多表连接 Sql的多表连接关系有:内连接.外连接和交叉连接. 先建立两个用于演示的表: TB_Characters: Id Character 1 内向 2 外向 3 中性性格 ...
- Scrum总结
Scrum总结一个轻量级的软件开发方法 Scrum是一个敏捷开发框架,是一个增量迭代的开发过程..在这个框架整个开发周期由若干个小的跌代周期,每个小的的跌代周期称为一个Sprint,每个Sprint的 ...
- Vim 命令 【转】
高级一些的编辑器,都会包含宏功能,vim当然不能缺少了,在vim中使用宏是非常方便的: :qx 开始记录宏,并将结果存入寄存器xq 退出记录模式@x 播放记录在x寄存器中的宏命 ...
- MySQL 更新中国列:1366 Incorrect string value 问题解决了
周围环境:Win7 64位置,mysql-5.6.25-winx64,MySQL workbench 问题:MySQL在更新时出现异常: warning(s): 1366 Incorrect stri ...
- JavaScript之包装对象
JavaScript对象是一种复合值:它是属性和已命名值的集合.通过"."符号来引用属性值.当属性值是一个函数时,称为方法. ①一段你常用但却未必明白其真正底层原理的代码: var ...
- 记得12306货运系统“抢购空”编写插件--chrome交互式插件的各个部分
--chrome交互式插件的各个部分 Chrome插件的基础知识就不多说了.随便找个新手教程就能够上手了,比如官方提供的Overview与Getting Started教程足够入门了:笔者也是现学现卖 ...
- hdu 2191 (多重背包+二进制优化)
Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...
- SQL字符串转换为数组
/*一.按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果. -----rtrim(@str)去掉 @str右边的字符 ltrim(@ ...
- pinyin4j新手教程
Pinyin4j新手教程 pinyin4j是一个支持将简体和繁体中文转换到成拼音的Java开源类库,作者是Li Min (xmlerlimin@gmail.com). 下面是一些详细的介绍和使用方式. ...