HDU 2795

题意:有一块矩形板,依次给定高,宽,和要贴的广告条的数量。广告条的高度都是1,宽度依次给定。

问:假设我们先按照从最上边开始贴,再按照从左边开始贴的顺序贴广告条,输出每条广告条应当贴在哪一行。如果不能贴上,输出-1

思路:将广告条的行数看作线段树的元素(这里有坑,因为题目所给的10^9次方是不能被记录下来的,但是最多只有200000张纸条所以最多也只有这么多行)。记录每个区间可贴的最长的广告条。

#include<stdio.h>

#include<iostream>

using namespace std;

int h,w,n,tmp;

bool ok;

int max(int a,int b)

{

    if(a>b)

        return a;

    return b;

}

struct tr

{

    int l,r,num;

};

tr me[200000<<2];

void build(int s,int e,int k)

{

    me[k].l=s;

    me[k].r=e;

    me[k].num=w;

    if(s==e)

    {

        return;

    }

    int m=(s+e)>>1;

    build(s,m,k<<1);

    build(m+1,e,k<<1|1);

}

void ans(int k)

{

    if(me[k].num<tmp||(!ok))

        return;

    if(me[k].l==me[k].r&&ok)

    {

        printf("%d\n",me[k].l);

        ok=0;

        me[k].num-=tmp;

        return;

    }

    ans(k<<1);

    ans(k<<1|1);

    me[k].num=max(me[k<<1].num,me[k<<1|1].num);

}

void solve()

{

    ok=1;

    scanf("%d",&tmp);

    ans(1);

    if(ok)

        printf("-1\n");

}

int main()

{

    while(scanf("%d%d%d",&h,&w,&n)!=EOF)

    {

        h=h<n?h:n;

        build(1,h,1);

        for(int i=1;i<=n;i++)

        {

            solve();

        }

    }

    return 0;

}

 

你可能感兴趣的:(HDU)