标签:des style os io for art ar div
Description
Input
Output
Sample Input
3 5 5 2 4 3 3 3
Sample Output
1 2 1 3 -1
题意:给你个h*w的黑板,然后再给你n张不同的1*w的海报,然后贴的 方式是优先贴最上面,然后是最左边的,问最后每张海报在第几层,不能贴的输出-1
思路:如果我们以宽或高作为区间的话,太大了,但是我们发现我们的n是最大的,就是说我们最多有n层,那么我们就以这个作为区间,然后每个线段的意思是:[l, r]层宽最大剩多少,剩下的是不难的单点更新
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#define lson(x) ((x) << 1)
#define rson(x) ((x) << 1 | 1)
using namespace std;
const int maxn = 200000;
int n, w, h;
struct seg {
int w;
};
struct segment_tree {
seg node[maxn<<2];
void update(int pos) {
node[pos].w = max(node[lson(pos)].w, node[rson(pos)].w);
}
void build(int l, int r, int pos) {
if (l == r) {
node[pos].w = w;
return;
}
int m = l + r >> 1;
build(l, m, lson(pos));
build(m+1, r, rson(pos));
update(pos);
}
void modify(int l, int r, int pos, int x) {
if (x > node[pos].w) {
printf("-1\n");
return;
}
if (l == r) {
printf("%d\n", l);
node[pos].w -= x;
return;
}
int m = l + r >> 1;
if (x <= node[lson(pos)].w)
modify(l, m, lson(pos), x);
else if (x <= node[rson(pos)].w)
modify(m+1, r, rson(pos), x);
update(pos);
}
} tree;
int main() {
int a;
while (scanf("%d%d%d", &h, &w, &n) != EOF) {
if (h > n)
h = n;
tree.build(1, h, 1);
for (int i = 1; i <= n; i++) {
scanf("%d", &a);
tree.modify(1, h, 1, a);
}
}
return 0;
}HDU - 2795 Billboard,布布扣,bubuko.com
标签:des style os io for art ar div
原文地址:http://blog.csdn.net/u011345136/article/details/38331797