Billboard

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Billboard</span>
Time Limit:8000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

在学校的入口处有一个巨大的矩形广告牌,高为h,宽为w。所有种类的广告都可以贴,比如ACM的广告啊,还有餐厅新出了哪些好吃的,等等。。
 
在9月1号这天,广告牌是空的,之后广告会被一条一条的依次贴上去。
 
每张广告都是高度为1宽度为wi的细长的矩形纸条。
 
贴广告的人总是会优先选择最上面的位置来帖,而且在所有最上面的可能位置中,他会选择最左面的位置,而且不能把已经贴好的广告盖住。

如果没有合适的位置了,那么这张广告就不会被贴了。
 
现在已知广告牌的尺寸和每张广告的尺寸,求每张广告被贴在的行编号。

Input

多组样例,不超过40个。
 
对每组样例,第一行包含3个整数h,w,n(1 <= h,w <= 10^9; 1 <= n <= 200,000) -广告牌的尺寸和广告的个数。 

下面n行每行一个整数 wi (1 <= wi <= 10^9) -  第i张广告的宽度.

Output

对每张广告,输出它被贴在的行编号(是1到h之间的数),顶部是第一行。如果某广告不能被贴上,则输出-1。

Sample Input

       
       
3 5 5
2
4
3
3
3


Sample Output

       
       
1
2
1
3
-1

#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"

using namespace std;

#define MAX 200005
#define lson id<<1
#define rson id<<1|1

int h,w,n;

struct TREE
{
    int l,r,sum;
}tree[MAX<<2];

void build(int id,int l,int r)
{
    tree[id].l = l;
    tree[id].r = r;
    tree[id].sum = w;
    if(l == r)
    {
        return ;
    }
    else
    {
        int mid = (l+r) >> 1;
        build(lson,l,mid);
        build(rson,mid+1,r);
    }
}

void update(int id,int val)
{
    if(tree[id].l == tree[id].r)
    {
        tree[id].sum -= val;
        printf("%d\n",tree[id].l);
        return ;
    }
    if(tree[lson].sum >= val)
    { 
        update(lson,val);
    }
    else
    {
        update(rson,val);
    }
    tree[id].sum = max(tree[lson].sum,tree[rson].sum);
}

int main()
{
    while(~scanf("%d%d%d",&h,&w,&n))
    {
        if(h > n) {h = n;} //每个广告的高度为1,自上而下的贴,最多占据n行,n + 1 ~ h的部分都是无用的
        build(1,1,h);
        int m;
        while(n--)
        {
            scanf("%d",&m);
            if(m > tree[1].sum)
            {
                printf("-1\n");
            }
            else
            {
                update(1,m);
            }
        }
    }
    return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值