原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=2795
一:题意
一个width*height的广告布栏,现在有n个width_i*1的小广告,要求这些广告尽量贴在靠顶端,靠左边,求出每个小广告在公布栏的第几层,默认广告栏顶端是第一层。
二:分析
题目已经是很简单了,广告是一条一条来的,也就是第二个纸条不能贴在第一个之前,必须按顺序来。
简单的线段树,节点保存着该层还有多少剩余的宽度。
三:AC代码
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int a[200000 * 4];
int h, w, n;
void build(int l, int r, int root)
{
a[root] = w;
if (l == r)
return;
build(l, (l + r) / 2, root * 2);
build((l + r) / 2 + 1, r, root * 2 + 1);
}
int query(int x, int l, int r, int root)
{
if (l == r)
{
a[root] -= x;
return l;
}
int ans = x <= a[root << 1] ? query(x, l, (l + r) / 2, root << 1) : query(x, (l + r) / 2 + 1, r, root * 2 + 1);
a[root] = max(a[root << 1], a[root << 1 | 1]);
return ans;
}
int main()
{
int x;
while (~scanf("%d%d%d", &h, &w, &n))
{
if (n < h)
h = n;
build(1, h, 1);
while (n--)
{
scanf("%d", &x);
if (x > a[1])//巧妙
printf("-1\n");
else
printf("%d\n", query(x, 1, h, 1));
}
}
return 0;
}