Billboard(HDOJ2795)

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795

题意:给出广告板的高和宽,然后在给出1*m的广告,判断每块广告牌是否能放开,原则是广告尽量往广告牌的左上角放。

源码:

#include<iostream>
using namespace std;
#define lson l,mid,index<<1
#define rson mid+1,r,index<<1|1
#define MAX 222222
int node[MAX<<2];
int h,w,num;
void build(int l,int r,int index)
{
   node[index]=w;
   if(l==r) return ;
   int mid=(l+r)>>1;
   build(lson);
   build(rson);
}
void getMax(int index)
{
  node[index]=node[index<<1]>node[index<<1|1]?node[index<<1]:node[index<<1|1];
}
int query(int l,int r,int index,int querydata)
{
  if(l==r)
  {
    node[index]-=querydata;
	return l;
  }
  int mid=(l+r)>>1;
  int ret=(node[index<<1]>=querydata)?query(lson,querydata):query(rson,querydata);
   getMax(index);
   return ret;
}
int main()
{
	while(~scanf("%d%d%d",&h,&w,&num))
	{
	if(h>num) h=num;
	build(1,h,1);
	while(num--)
	{
		int querydata;
	  scanf("%d",&querydata);
	  if(node[1]<querydata) printf("-1\n");//最大空间也装不上下
	  else printf("%d\n",query(1,h,1,querydata));
	}
	}
	return 0;
}

 

posted @ 2013-03-30 15:47  supersnow0622  Views(122)  Comments(0)    收藏  举报