hdu2795 Billboard

主要是利用线段树能求区间最大值的性质完成这样一个功能 “查询最靠前能容纳广告的位置“   将位置用来建树(实际上h<=n) 树中存位置还拥有的空间,若左子树的最大值大于他

就进入左子树,否则进入右子树。

#include<stdio.h>
#define maxn 200005
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int MAX[maxn<<2],h,w,n;
int build(int l,int r,int rt)
{
    MAX[rt]=w;
    if(l==r) return 0;
    int m=(l+r)>>1;
    build(lson);
    build(rson);
}
int Pushup(int rt)
{
    MAX[rt]=MAX[rt<<1]>MAX[rt<<1|1]?MAX[rt<<1]:MAX[rt<<1|1];
}
int query(int x,int l,int r,int rt)
{
    int ret,m;
    m=(l+r)>>1;
    if(l==r) { MAX[rt]-=x;return l;}
    else ret=MAX[rt<<1]>=x?query(x,lson):query(x,rson);
    Pushup(rt);
    return ret;
}
int main()
{
    int i,temp;
    while(~scanf("%d%d%d",&h,&w,&n)){
    if(h>n) h=n;
    build(1,h,1);
    for(i=1;i<=n;i++)
        {
            scanf("%d",&temp);
            if(MAX[1]<temp) printf("-1\n"); 
            else printf("%d\n",query(temp,1,h,1));
        }
    }
    return 0;
}


你可能感兴趣的:(query,Build)