• hdu2795 Billboard(线段树)


    题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子
    思路:每次找到最大值的位子,然后减去L
    线段树功能:query:区间求最大值的位子(直接把update的操作在query里做了)

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    const int maxn = 222222;
    int MAX[maxn<<2];
    int h,w,n;
    void PushUP(int rt)
    {
        MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]);
    }
    ///这里与前面的不一样
    void build(int l,int r,int rt)
    {   ///每一个的开始都是W;
        MAX[rt]=w;
        if(l==r)
        {
            return ;
        }
        int m=(r+l)>>1;
        build(lson);
        build(rson);
    
    }
    
    int query(int x,int l,int r,int rt)
    {
        int ret;
        if( l==r )
        {
            MAX[rt]-=x;
            return l;
        }
        int m=(l+r)>>1;
        if(MAX[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)!=EOF)
        {
            if(h>n)
            h=n;
            build(1,h,1);
            while(n--)
            {
                int x;
                scanf("%d",&x);
                if(MAX[1]<x)
                puts("-1");
                else
                printf("%d
    ",query(x,1,h,1));
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    InterLockedIncrement and InterLockedDecrement
    bzoj2763
    bzoj1922
    bzoj1705
    bzoj1040
    bzoj3039
    bzoj1801
    bzoj2565
    bzoj1976
    一类最小割bzoj2127,bzoj2132 bzoj3438
  • 原文地址:https://www.cnblogs.com/shuaihui520/p/9069051.html
Copyright © 2020-2023  润新知