(2795)HDU

#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>


#define ll __int64
#define MAX 1000009
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1


using namespace std;


/*
题意:有一块h*w的墙,有N个宣传单 每个的大小为 1*wi 每次贴都从最左最上能贴的位置开始。求每一宣传单被贴在哪一行。


思路:线段树,以1~h划分区间,每一个区间中保存该区间能放下的最大长度,每次从最上面开始找,找到符合的位置 贴上,该位置减去len,更新区间的最大长度值。
*/


const int MAXN = 222222;


int _MAX[MAXN<<2];
int h,w,n;


void PushUP(int rt)
{
    _MAX[rt] = max(_MAX[rt<<1],_MAX[rt<<1|1]);
}
void build(int l,int r,int rt)
{
    _MAX[rt] = w;
    if(l==r)
    {
        return ;
    }
    int m = (l+r)>>1;
    build(lson);
    build(rson);
}
int query(int x,int l,int r,int rt)
{
    if(l == r)
    {
        _MAX[rt] -= x;
return l;//这里是L 坑爹啊 返回位置
    }
    int m = (l + r)>>1;
    int ret;
    if(_MAX[rt<<1]>=x)
        ret = query(x,lson);
    else
        ret = query(x,rson);
    PushUP(rt);
    return ret;


}
int main()
{
    int x;
    while(~scanf("%d%d%d",&h,&w,&n))
    {
        if(h>n)
            h = n;
        build(1,h,1);
        while(n--)
        {
            scanf("%d",&x);
            if(_MAX[1]<x)
                printf("%d\n",-1);
            else
                printf("%d\n",query(x,1,h,1));
        }
    }
    return 0;
}

你可能感兴趣的:((2795)HDU)