#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=200000;//announcement最多只有200000条,就算它每条都是w的长度,也只能用到200000行,所以n就够了
int room[maxn<<2],n,h,w;
void pushUp(int rt){
room[rt]=max(room[rt<<1],room[rt<<1|1]);//去左右子树中的最大剩余长度作为根的剩余空间
}
void build(int l,int r,int rt){
if(l==r){
room[rt]=w;
return;
}
int m=(l+r)>>1;
build(lson),build(rson);
pushUp(rt);
}
int update(int len,int l,int r,int rt){//线段树 常规用法
if(l==r){
room[rt]-=len;
return l;
}
int m=(l+r)>>1,ret=0;
if(len<=room[rt<<1])ret=update(len,lson);//每次先看看左边的够不够放
else ret=update(len,rson); //左边不够,放右边
pushUp(rt);
return ret;
}
int main(){
while (scanf("%d%d%d",&h,&w,&n)==3)
{
int rn=min(h,n);//取h,n的最小值作为n,因为最多只有n条和最长只有h行,多了没必要
build(1,rn,1);
for (int i=0;i<n;++i)
{
int len;
scanf("%d",&len);
if(len>room[1])printf("-1\n");//如果announcement的长度比每行的长度都长(room[1]表示1-n行里面的最大的剩余长度),就不用去找了
else printf("%d\n",update(len,1,rn,1));
}
}
return 0;
}
HDU 2975 Billboard(线段树)
最新推荐文章于 2021-11-15 22:13:06 发布