标签: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