Billboard (HDU 2795)

本文介绍了一个基于线段树的数据结构解决方案来解决HDU2795 Billboard问题。通过使用线段树进行区间查询和单点更新,有效地处理了广告牌的查询与更新操作。该算法首先初始化线段树,然后根据输入执行相应的查询或更新操作。

Billboard (HDU 2795)

Hdu 2795

注意到每个广告的长度是1,因此可以将每这一张广告牌当成一个数列表示,每个初始值为w。使用线段树维护这个数列,每次查询为找到这个数列第一个大于等于x的位置,每次修改操作为将找到的位置值-x

线段树功能:区间查询+单点更新

#include <cstdio>
#include <utility>
#include <queue>
#include <cstring>
#define scan(x) scanf("%d",&x)
#define scan2(x,y) scanf("%d%d",&x,&y)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define root 1,1,h
using namespace std;
const int Max=2e5+10;
int sum[Max<<2];
int h,w,n;
void Pushup(int rt)
{
    sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
void Build(int rt,int l,int r)
{
    if(l==r)
    {
        sum[rt]=w;
        return;
    }
    int mid=(l+r)>>1;
    Build(lson);
    Build(rson);
    Pushup(rt);
}
int Query(int x,int rt,int l,int r)
{
    if(l==r)
    {
        sum[rt]-=x;
        return l;
    }
    int mid=(l+r)>>1,ret;
    if(sum[rt<<1]>=x) ret=Query(x,lson);
    else ret=Query(x,rson);
    Pushup(rt);
    return ret;
}
int main()
{
    while(~scanf("%d%d%d",&h,&w,&n))
    {
        if(h>n) h=n;
        Build(root);
        int x;
        for(int i=0;i<n;i++)
        {
            scan(x);
            if(sum[1]<x) printf("-1\n");
            else
            {
                printf("%d\n",Query(x,root));
            }
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/zsyacm666666/p/6695119.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值