hdu 2795 Billboard 线段树

以高为数轴,维护每个区间的剩余最大值,用线段树二分做

#include <stdio.h>
#define maxn 200100
int Max[4*maxn];
int h,w,n;
int max(int a,int b)
{
    if(a>b) return a;
    else return b;
}
void build(int l,int r,int o)
{
    Max[o]=w;
    if(l==r) return ;
    int m=(l+r)/2;
    build(l,m,2*o);
    build(m+1,r,2*o+1);
}

int query(int x,int l,int r,int o)
{
    if(l==r)
    {
        Max[o]-=x;
        return l;
    }
    int m=(l+r)/2;
    int ans;
    if(Max[o*2]>=x) ans=query(x,l,m,o*2);
    else ans=query(x,m+1,r,o*2+1);
    Max[o]=max(Max[2*o],Max[2*o+1]);
    return ans;
}
int main()
{
    int i;
    while(scanf("%d%d%d",&h,&w,&n)!=EOF)
    {
        if(h>n) h=n;
        build(1,h,1);
        int x;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&x);
            if(Max[1]<x) printf("-1
");
            else printf("%d
",query(x,1,h,1));
        }
    }
    return 0;
}


 

原文地址:https://www.cnblogs.com/vermouth/p/3710163.html