原题链接:传送门
题意:有一个h*w的广告牌,每个广告会占用1*n的空位,广告优先贴在高处,贴在左边。如果能贴就输出这个广告贴在第几行,不能贴就输出-1。
#include <iostream>
#include <cstring>
#include <cstdio>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int N = 200005;
int num[N<<2];
int h,w,n;
void PushUp(int rt) {
num[rt] = max(num[rt<<1] , num[rt<<1|1]);
}
void Build(int l,int r,int rt) {
if(l == r) {
num[rt] = w; //初始化空广告位每行长为w
return ;
}
int m = (r-l)/2 + l;
Build(lson);
Build(rson);
PushUp(rt);
}
void Updata(int d,int l,int r,int rt) {
if(d > num[rt]) { //广告长度大于当前广告牌空位长度
printf("-1\n");
return ;
}
if(l == r) {
num[rt] -= d; //广告牌空位减去广告长度
printf("%d\n",l); //输出左边的节点
return ;
}
int m = (r-l)/2 + l;
if(d <= num[rt<<1]) Updata(d,lson); //广告长度小于左子节点长度,
else Updata(d,rson);
PushUp(rt);
}
int main() {
while(~scanf("%d%d%d",&h,&w,&n)) {
if(h > n) //小优化一下
h = n;
Build(1,h,1);
int d;
for(int i=0; i<n; i++) {
scanf("%d",&d);
Updata(d,1,h,1);
}
}
return 0;
}