HDU2795Billboard (线段树)

来源:互联网 发布:lvs mysql负载均衡 编辑:程序博客网 时间:2024/05/02 07:45

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795

题意:有一块尺寸为h*w的矩形长板,要在上面贴1*wi的海报n张,选择贴海报的位置是:尽量高,同一高度,选择尽量靠左的地方。要求输出每张海报的高度位置。


一句话题解:用最底层的单个结点(也就是当tree[i].l==tree[i].r时的点)来表示高度的.......

#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;const int maxn = 200005;struct Seg{    int l, r, w;}tree[maxn<<2];int h, w, n;void build(int left, int right, int rt){    int mid = (left + right) >> 1;    tree[rt].l = left;    tree[rt].r = right;    tree[rt].w = w;    if(left == right)        return ;    build(left, mid, rt<<1);    build(mid+1, right, rt<<1|1);}int query(int x, int rt){    if(tree[rt].l == tree[rt].r)    {        tree[rt].w -= x;        return tree[rt].l;    }    int res = (tree[rt<<1].w >= x ? query(x, rt<<1) : query(x, rt<<1|1));    tree[rt].w = max(tree[rt<<1].w, tree[rt<<1|1].w);    return res;}int main(){    while(scanf("%d%d%d", &h, &w, &n) != EOF)    {        if(h > n)            h = n;        build(1, h, 1);        while(n--)        {            int x;            scanf("%d", &x);            if(tree[1].w < x)                printf("-1\n");            else                printf("%d\n", query(x, 1));        }    }    return 0;}


0 0
原创粉丝点击