<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 524333
Sample Output
1213-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;
}