zoukankan      html  css  js  c++  java
  • hdu 2795 Billboard

    题目大意:有一个H*W的广告牌,我们要将好多 1 *Wi的条幅贴上去,且每次都是要靠上靠左,问的是贴在第几排。

    思路:用每一个节点记录区间的最大值。我们query的时候优先找他的左孩子,如果左边还是可以放下的话就去左边搜。

    因为题目说的是优先往上方放,所以右孩子应该大于左孩子的,但是如果左边可以放,我们就要放在左边。

    在query的时候就更新。

    当TREE[1]<=X的时候,就已经放不下了。总的还是单点更新

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define MAXN 222222
    using namespace std;
    int tree[MAXN<<2];
    int h,w,n;
    void build(int num,int l,int r)
    {
        tree[num]=w;
        if(l==r)return;
        int mid=(l+r)>>1;
        build(num<<1,l,mid);
        build(num<<1|1,mid+1,r);
    }
    
    int query(int num,int s,int e,int x)
    {
        int mid=(s+e)>>1;
        if(s==e)
        {
            tree[num]-=x;
            return s;
        }
        int tmp;
        tmp = tree[num<<1] >=x ? query(num<<1,s,mid,x) : query(num<<1|1,mid+1,e,x);
        tree[num] = max(tree[num<<1],tree[num<<1|1]);
        return tmp;
    }
    
    int main()
    {
        while(scanf("%d%d%d",&h,&w,&n)!=EOF)
        {
            if(h>n)h=n;
            build(1,1,h);
    
            for(int i=1;i<=n;i++)
            {
                int x;
                scanf("%d",&x);
    
                if(tree[1]<x)printf("-1
    ");
                else
                printf("%d
    ",query(1,1,h,x));
            }
        }
        return 0;
    }
    


  • 相关阅读:
    进程通信方式-管道pipe
    进程间通信
    信号的发送与处理
    信号应用于事件通知
    信号的屏蔽,信号集
    信号的发送kill,raise,alarm,setitimer,abort,sigqueue
    信号处理函数的返回sigsetjmp/siglongjmp
    POJ 1562 Oil Deposits
    HDU 1016 Prime Ring Problem
    HDU 1010 Tempter of the Bone
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3194315.html
Copyright © 2011-2022 走看看