HDU2795-Billboard(点更点查)

题意:

给出一个高h,宽w的板子,要写n条长为x的广告,问从1->h 可以写在哪个位置。

思路:

第一次写的时候没注意数据 造了个4*h的线段树,果断RE,再想了想n的数据很小,如果依据n来构造线段树,就解决了

在构造的时候注意左,右子树的val值的更新,以及构建当前树是几号,还有就是在当前节点如果max( 左,右) <  我们需要的宽度 就返回-1.


#include <stdio.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#define lson i<<1,left,mid
#define rson i<<1|1,mid+1,right
using namespace std;
int h,w,n;
int ans=0,cnt;
struct TreeNode
{
    int left_val,right_val,val,left,right,num;
} Tree[800005];
void Build(int i , int left , int right )
{
    Tree[i].left=left;
    Tree[i].right=right;
    if(left==right)
    {
        Tree[i].num=++cnt;
        Tree[i].val=w;
        return ;
    }
    int mid=(left+right)>>1;
    Build(lson);
    Build(rson);
    Tree[i].val=max(Tree[i<<1].val,Tree[i<<1|1].val);
    Tree[i].left_val=Tree[i<<1].val;
    Tree[i].right_val=Tree[i<<1|1].val;
}

void update(int i,int val)
{
    if(Tree[i].val<val||Tree[i].num>h)
    {
        ans=-1;
        return ;
    }
    if(Tree[i].left== Tree[i].right )
    {
        Tree[i].val-=val;
        ans=Tree[i].num;
        return ;
    }
    if(val<=Tree[i].left_val)
    {
        update(i<<1 ,val);
    }
    else
    {
        update(i<<1|1 ,val);
    }
    Tree[i].left_val=Tree[i<<1].val;
    Tree[i].right_val=Tree[i<<1|1].val;
    Tree[i].val=max(Tree[i<<1].val,Tree[i<<1|1].val);
}
int main()
{
    int x;
    while(~scanf("%d%d%d",&h,&w,&n))
    {
        cnt=0;
        Build(1,1,n);
        while(n--)
        {
            scanf("%d",&x);
            ans=0;
            update(1,x);
            printf("%d\n",ans);
        }
    }
    return 0;
}
/*
1 5 2
5
1

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值