HDU-2795-Billboard

HDU-2795-Billboard

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

线段树,建树时要注意范围

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define N 200005
int h,w;
struct cam
{
	int x;
	int y;
	int len;
}list[N*4];
int Max(int x,int y)
{
	return x>y?x:y;
}
void build(int k,int x,int y)
{
	list[k].x=x;
	list[k].y=y;
	list[k].len=w;
	if(x==y)
	return;
	int mid=(x+y)/2;
	build(k<<1,x,mid);
	build(k<<1|1,mid+1,y);
}
void find(int k,int x)
{
	if(list[k].len>=x)
	{
		if(list[k].x==list[k].y)
		{
			list[k].len-=x;
			printf("%d\n",list[k].x);
			return;
		}
		else if(list[2*k].len>=x)
		{
			find(k<<1,x);
			list[k].len=Max(list[k<<1].len,list[k<<1|1].len);
		}
		else
		{
            find(k<<1|1,x);
			list[k].len=Max(list[k<<1].len,list[k<<1|1].len);
		}
	}
	else
	printf("-1\n");
}
int main()
{
	int t,k;
	while(scanf("%d%d%d",&h,&w,&t)!=EOF)
	{
		if(h<N)
		build(1,1,h);  
		else
		build(1,1,N); //不需要管h,大于n的不会被贴到
		while(t--)
		{
			scanf("%d",&k);
			find(1,k);
		}
	}
	return 0;
}



你可能感兴趣的:(HDU-2795-Billboard)