题目链接:
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));
}
}
}