HDU Billboard
题目分析:给你n张海报,一个宣传板。让你在满足海报能够贴在最高位置的时候则贴的最高,无法满足时贴的最靠左,输出海报所贴的高度。假设不能贴则输出-1.
一道非常easy,可是我没想出的基础线段树。
算法思想:
把宣传板的高度转换成线段树的区间,从而得知每个区间的大小当然为宣传板的宽度啦。然后,每次查询每个区间内的大小是否有满足当前海报宽度的,有责得到结果。然后,在更新减去当前所用的宽度。依据线段是的特点,我们知道我们会先得到小的答案,即,较高的高度(高度从1-h)。
另一个须要处理的就是,当高度超过200000的时候,要截取。由于海报最多才200000,所以不须要那么高的宣传板。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std; #define L(rt) (rt << 1)
#define R(rt) (rt << 1 | 1)
#define MID(a,b) (a+((b-a) >> 1))
#define lson lft,mid,rt << 1
#define rson mid+1,rht,rt << 1 | 1 const int MAXN = 222222; struct Node{
int lft,rht,mx;
int mid(){return MID(lft,rht);};
}; Node tree[MAXN*4];
int w,h,n;
class Segtree{
public:
void Build(int lft,int rht,int rt){
tree[rt].lft = lft;tree[rt].rht = rht;
tree[rt].mx = w;
if(lft != rht){
int mid = tree[rt].mid();
Build(lson);
Build(rson);
}
}
int Update(int rt,int val){
int lft = tree[rt].lft,rht = tree[rt].rht;
if(lft == rht){
tree[rt].mx -= val;
return lft;
}
else{
int pos;
if(tree[L(rt)].mx >= val)pos = Update(L(rt),val);
else pos = Update(R(rt),val);
tree[rt].mx = max(tree[L(rt)].mx,tree[R(rt)].mx);
return pos;
}
}
}; int main()
{
while(~scanf("%d%d%d",&h,&w,&n)){
Segtree seg;
seg.Build(1,min(h,MAXN),1);
for(int i = 0;i < n;++i){
int wid;
scanf("%d",&wid);
if(tree[1].mx < wid)printf("-1\n");
else printf("%d\n",seg.Update(1,wid));
}
}
return 0;
}
HDU Billboard的更多相关文章
- 线段树(维护最大值):HDU Billboard
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2795 Billboard(线段树的另类应用)
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 1882 Strange Billboard(位运算+枚举)
http://acm.hdu.edu.cn/showproblem.php?pid=1882 感觉非常不错的一道题. 给一个n*m(1<=n,m<=16)的矩阵,每一个格子都有黑白两面,当 ...
- hdu 2795 Billboard 线段树单点更新
Billboard Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=279 ...
- hdu 2795 Billboard(线段树+单点更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 Billboard Time Limit: 20000/8000 MS (Java/Others ...
- HDU 2795——Billboard——————【单点更新、求最小位置】
Billboard Time Limit:8000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- HDU 2795 Billboard 【线段树维护区间最大值&&查询变形】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=2795 Billboard Time Limit: 20000/8000 MS (Java/Others) ...
- HDU 2795 Billboard(宣传栏贴公告,线段树应用)
HDU 2795 Billboard(宣传栏贴公告,线段树应用) ACM 题目地址:HDU 2795 Billboard 题意: 要在h*w宣传栏上贴公告,每条公告的高度都是为1的,并且每条公告都要 ...
- Billboard (HDU 2795)
Billboard (HDU 2795) Hdu 2795 注意到每个广告的长度是1,因此可以将每这一张广告牌当成一个数列表示,每个初始值为w.使用线段树维护这个数列,每次查询为找到这个数列第一个大于 ...
随机推荐
- 赵雅智_BroadcastReceiver短信监听
AndroidManifest.xml 注冊广播接收者 加入权限 <?xml version="1.0" encoding="utf-8"?> &l ...
- Java 开源博客 —— Solo 0.6.9 发布时间!
Solo 它是 GitHub 上 Star 的最大数量 Java 博客系统,今天,我们宣布 0.6.9 正式版,欢迎来到下载. 特性 基于标签的文章分类 博客/标签 Atom/RSS.Sitemap ...
- php调用webservice的几种方法
原文:php调用webservice的几种方法 1.WSDL模式: $soap = new SoapClient("http://192.168.6.69:8899/Service1.asm ...
- [创意标题] spoj 11354 Amusing numbers
意甲冠军: 给k(1<=k<=10^15),先询问k 大只包含数字5和6的数目是多少 实例 1那是,5 ,3那是,55 .4那是,56 思考: 首先,我们可以找到.有许多2这是头号,有两个 ...
- 与我一起extjs5(04--MVVM简要说明财产)
与我一起extjs5(04--MVVM简要说明财产) 以下我们来看一下自己主动生成的代码中的MVVM架构的关系. Main是一个可视的控件,MainController是这个控件的控制 ...
- 思维导图(自己整理,希望对大家有用):JavaScript函数+canvas绘图+Array数组
1.javascript函数: 2.Array数组: 3.canvas绘图:
- 使用Canvas和Paint自己绘制折线图
主要用于Canvas一个特别简单的小demo. 能够手动点击看每一个月份的数据.很easy.就是用paint在canvas上画出来的. 主要内容就是计算左边价格的位置,以下日期的位置,三根虚线的位置, ...
- boostrap-非常好用但是容易让人忽略的地方------input-group-btn
1.正常的使用 <div class="form-group"> <div class="input-group"> <input ...
- iOS_20_微博的骨架结构
最后效果图: BeyondViewController.m // // BeyondViewController.m // 20_帅哥no微博 // // Created by beyond on 1 ...
- 折返(Reentrancy)VS线程安全(Thread safety)
在Wiki上,折返例如,下面的定义(接) In computing, a computer program or subroutine is called reentrant if it can be ...