http://acm.hdu.edu.cn/showproblem.php?pid=2795

下午做的题,线段树单点更新

广告牌高h宽w,尽可能在高处挂广告。注意h可能很大,但是我们注意到h比n大就没有意义了,这时我们让h=n(开始因为这个re了)

View Code
#include <iostream>
using namespace std ;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=200002 ;
int h,w,n ;
int MAX[maxn<<2] ;
void pushup(int rt)
{
    MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]) ;
}
void build(int l,int r,int rt)
{
    MAX[rt]=w ;
    if(l==r)
        return ; 
    int m=(l+r)>>1 ;
    build(lson) ;
    build(rson) ;
}
int query(int p,int l,int r,int rt)
{
    if(l==r)
    {
        MAX[rt]-=p ;
        return l ;
    }
    int m=(l+r)>>1 ;
    int ans ;
    if(MAX[rt<<1]<p)
        ans=query(p,rson) ;
    else
        ans=query(p,lson) ;
    pushup(rt) ;
    return ans ;
}
int main()
{
    while(~scanf("%d%d%d",&h,&w,&n))
    {
        if(h>n)
            h=n ;
        build(1,h,1) ;
        int wi ;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&wi) ;
            if(MAX[1]<wi)
                puts("-1") ;
            else
                printf("%d\n",query(wi,1,h,1)) ;
        }
    }
    return 0 ;
}