Billboard

Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 23498    Accepted Submission(s): 9687

Problem Description
At
the entrance to the university, there is a huge rectangular billboard
of size h*w (h is its height and w is its width). The board is the place
where all possible announcements are posted: nearest programming
competitions, changes in the dining room menu, and other important
information.

On September 1, the billboard was empty. One by one, the announcements started being put on the billboard.

Each announcement is a stripe of paper of unit height. More specifically, the i-th announcement is a rectangle of size 1 * wi.

When
someone puts a new announcement on the billboard, she would always
choose the topmost possible position for the announcement. Among all
possible topmost positions she would always choose the leftmost one.

If
there is no valid location for a new announcement, it is not put on the
billboard (that's why some programming contests have no participants
from this university).

Given the sizes of the billboard and the
announcements, your task is to find the numbers of rows in which the
announcements are placed.

 
Input
There are multiple cases (no more than 40 cases).

The
first line of the input file contains three integer numbers, h, w, and n
(1 <= h,w <= 10^9; 1 <= n <= 200,000) - the dimensions of
the billboard and the number of announcements.

Each of the next n lines contains an integer number wi (1 <= wi <= 10^9) - the width of i-th announcement.

 
Output
For
each announcement (in the order they are given in the input file)
output one number - the number of the row in which this announcement is
placed. Rows are numbered from 1 to h, starting with the top row. If an
announcement can't be put on the billboard, output "-1" for this
announcement.
 
Sample Input
3 5 5
2
4
3
3
3
 
Sample Output
1
2
1
3
-1
 
再次温习一下线段树,这道题算是较简单的线段树了吧。
这个题目意思就是给出h个大小初始为w的数这些数大小一样但有各自的顺序,接着进行n次询问,每次要从这些数找到一个不小于询问值得数,且这个数尽量排在前面,如果没有找到输出-1,如果找到就让这个数更新为此数减去询问值后的值。
暴力寻找得话会T,考虑适当的数据结构来简化操作。
进一步的思考时候发现,如果一段区间分为两部分只要前面部分的最大值>=询问值,我们就不必考虑后面部分的数了,由此想到使用线段树,维护一个区间最大值即可。由于更新和查找都是log级别不会T。
还有一点就是这个最大的区间并不一定是[1,H],H最大1e9,不可能开出这个多空间保存节点,我们注意到N最大就是20w,由于要尽可能的将可以放置的数放在前面,
所以最大也就占用20w行,换句话说R最小的最大区间应是 [1,min(H,N)];这里的区间[l,r]指的是从l行到r行,所以maxn[i]就是第i个节点对应的所有行中剩余的最大宽度。
还是不太熟练犯了许多小错误,例如将结点值与L,R搞混。
 #include<bits/stdc++.h>
using namespace std;
int maxn[(<<)+];
int H,N,W,X;
void build()
{
int M=X<<;
for(int i=;i<=M;++i) maxn[i]=W;
}
void update(int L,int R,int id,int tar,int x)
{
int m=(L+R)>>,lc=id<<,rc=(id<<)|;
if(L==R&&L==tar) {maxn[id]=x;return;}
if(tar<=m){
update(L,m,lc,tar,x);
}
else{
update(m+,R,rc,tar,x);
}
maxn[id]=max(maxn[lc],maxn[rc]);
}
int ask(int L,int R,int id,int x)
{
if(maxn[id]<x) return -;
if(L==R) {update(,X,,L,maxn[id]-x);return L;}
int m=(L+R)>>,lc=id<<,rc=(id<<)|;
if(maxn[lc]>=x){
return ask(L,m,lc,x);
}
else{
return ask(m+,R,rc,x);
}
}
int main()
{
int i,j,k,wi;
while(cin>>H>>W>>N){X=min(H,N);
build();
for(i=;i<=N;++i){
scanf("%d",&wi);
printf("%d\n",ask(,X,,wi));
}
}
return ;
}
 

HDU 2795 线段树单点更新的更多相关文章

  1. HDU 2795 (线段树 单点更新) Billboard

    h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子. 每次找能放纸条而且是最上面的位置,询问完以后可以同时更新,所以可以把update和query写在同一个函数里. #include ...

  2. hdu 1166线段树 单点更新 区间求和

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. hdu 1166 线段树单点更新

    等线段树复习完再做个总结 1101 2 3 4 5 6 7 8 9 10Query 1 3Add 3 6Query 2 7Sub 10 2Add 6 3Query 3 10End Case 1:633 ...

  4. HDU 3308 线段树单点更新+区间查找最长连续子序列

    LCIS                                                              Time Limit: 6000/2000 MS (Java/Oth ...

  5. hdu 1754 线段树 单点更新 动态区间最大值

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

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

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

  7. HDU 1166 敌兵布阵(线段树单点更新,板子题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  8. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

  9. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

随机推荐

  1. python爬虫中文乱码解决方法

    python爬虫中文乱码 前几天用python来爬取全国行政区划编码的时候,遇到了中文乱码的问题,折腾了一会儿,才解决.现特记录一下,方便以后查看. 我是用python的requests和bs4库来实 ...

  2. undefined reference to `__sync_bool_compare_and_swap_4

    然后开始glibc的编译工作. 你必须设定march这个参数才行,要不然会出现“undefined reference to `__sync_bool_compare_and_swap_4′.”这个错 ...

  3. node异步流程控制async

    1.串行无关联:async.series(tasks,callback); 多个函数依次执行,之间没有数据交换,其中一个函数出错,后续函数不再执行 async.series({ one: functi ...

  4. sift算法特征点如何匹配?

    https://www.zhihu.com/question/23371175 我需要把一张照片和训练集中的图片进行匹配.我把一张照片提取特征值并建立kd树,然后把训练集的图片依次读进来,然后把图片的 ...

  5. Java学习笔记之对象的复制和克隆

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  6. Java-性能调优工具-jstat

    jps 查看当前java进程 [ ~]# jps 9939 Resin 9874 WatchdogManager 18293 Jps jstat -gc -t pid 1s [ ~]# jstat - ...

  7. FactoryBean

    总结自:https://www.cnblogs.com/davidwang456/p/3688250.html Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即xxxF ...

  8. JPA、JTA与JMS

    三者都属于Java企业级规范 JPA(java persistence API) JPA 通过JDK5.0的注解或XML来描述 对象-关系表的映射关系,并将运行期的实体对象持久化存储到数据库中. JT ...

  9. mybatis家族

    mybatis 优秀的持久层框架,它支持定制化SQL.存储过程以及高级映射. 备注:通过mapper实现数据库与实体类相互映射 MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果 ...

  10. Mac开发配置手册

    系统设置 在任何的操作系统中,首先你需要做一件事就是更新系统,点击窗口左上角的  > 关于本机 > 软件更新.此外,如果这是一部新的电脑,你还需要到系统设置进行一些适当调整.如何调整,取 ...