HA2795Billboard 可用线段树

本文介绍了一个使用线段树实现的广告栏布局算法。该算法针对一个给定尺寸的广告栏,能够有效地放置多个不同宽度的广告,每次尽可能将广告放置在最左侧的位置,并输出其所在行数。
#include<iostream>

using namespace std;

#include<cstdio>

#include<algorithm>

#define maxn 200005

int h,n,w;

int root[maxn<<4];

int ans;//标记

void make_tree(int l,int r,int rt)

{

    if(l==r)

    {

        root[rt]=w;

        return ;

    }

    int mid=(r+l)/2;

    make_tree(l,mid,rt*2);

    make_tree(mid+1,r,rt*2+1);

    root[rt]=max(root[rt*2],root[rt*2+1]);

}

void query(int b,int l,int r,int rt)

{

    if(root[rt]<b)return ;

    if(l==r)

    {

        root[rt]-=b;

        ans=l;

        return;

    }

    int mid=(l+r)/2;

    if(ans==-1) query(b,l,mid,rt*2);

    if(ans==-1) query(b,mid+1,r,rt*2+1);

    if(ans!=-1) root[rt]=max(root[rt*2],root[rt*2+1]);

}

int main()

{

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

    {

        if(h>200000) h=200000;

        make_tree(1,h,1);

        while(n--)

        {

            int a;

            ans=-1;

            scanf("%d",&a);

            query(a,1,h,1);

            printf("%d\n",ans);

        }

    }

    return 0;

}
View Code

 

第一眼又是坑长的英文,细看外加用了点灵格斯,题目大意是一个广告栏要加广告上去,输入广告栏的长(h)宽(w)和所加广告的个数n,然后n行依次输入n个数代表所加广告的宽(广告的长都是1),每一次加广告上去,都尽量把广告往左上位置放,每放一个广告输出它放在广告栏的第几行(长度),没有位置放则输出"-1"。

     用线段树,建树,每一个root[rt]=w,放广告就从左树先查找,长度从小到大,当满足root[rt]>n[i]能放广告时,记下left位置,并相应的减去x[i],输出left;不能放输出"-1"。

转载于:https://www.cnblogs.com/zlpzjy/p/3216313.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值