hdu2795Billboard(线段树)

题目链接:

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

题目大意就是给你一个h*w的广告牌,一个广告牌有1*wi 的长度广告牌要求在最左端最上端,问你每输入一个广告牌,它的位置在哪

这道题就是一个线段树的最大值了,每次都减一下就好了。

AC代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn = 222222;  
int MAN[maxn<<2];
int h,w,n;
void pushup(int rt)
{
	MAN[rt]=max(MAN[rt<<1],MAN[rt<<1|1]);
}
void build(int l,int r,int rt)
{
	MAN[rt]=w;
	if(l==r)
		return;
	int m=(l+r)>>1;
	build(lson);
	build(rson);
}
int query(int x,int l,int r,int rt)
{
	int ret;
	if(l==r)
	{
		MAN[rt]=MAN[rt]-x;
		return l;
	}
	int m=(l+r)>>1;
	ret=(MAN[rt<<1]>=x) ? query(x,lson):query(x,rson);
	pushup(rt);
	return ret;
}
int main()
{
	while(~scanf("%d%d%d",&h,&w,&n))
	{
		if(h>n) h=n;
		build(1,h,1);
		while(n--)
		{
			int x;
			scanf("%d",&x);
			if (MAN[1] < x) puts("-1");  
            else printf("%d\n",query(x , 1 , h , 1)); 
		}
	}
}


你可能感兴趣的:(HDU)