题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=2795
题意 :h*w 的木板 , 放进一些 1*L 的物品 , 求每次放 空间能容纳且最上边 的位子思路 : 每次找到最大值的位子 , 然后减去 L
线段树功能 :query: 区间求最大值的位子 ( 直接把 update 的操作在 query 里做了 )
#include <iostream>
#include<cstdio>
#include <algorithm>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn=2e5;
int sum[maxn<<2],h,w;
void Pushup(int rt)
{
sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
void build(int l,int r,int rt)
{
sum[rt]=w;
if(l==r)return;
int m=(l+r)>>1;
build(lson);
build(rson);
Pushup(rt);
}
int query(int p,int l,int r,int rt)
{
if(l==r)
{
sum[rt]-=p;
return l;
}
int m=(l+r)>>1;
int ret=0;
if(sum[rt<<1]>=p)ret=query(p,lson);
else ret=query(p,rson);
Pushup(rt);
return ret;
}
int main()
{
int n,i,wi;
while(~scanf("%d%d%d",&h,&w,&n)&&h)
{
if(h>n)h=n;
build(1,h,1);
for(i=0;i<n;i++)
{
scanf("%d",&wi);
if(sum[1]<wi)printf("-1\n");
else printf("%d\n",query(wi,1,h,1));
}
}
return 0;
}