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;
}

浙公网安备 33010602011771号