您的位置:首页 > 其它

hdu 2795 Billboard 线段树

2014-03-09 17:06 344 查看
以高为数轴,维护每个区间的剩余最大值,用线段树二分做

#include <stdio.h>
#define maxn 200100
int Max[4*maxn];
int h,w,n;
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
void build(int l,int r,int o)
{
Max[o]=w;
if(l==r) return ;
int m=(l+r)/2;
build(l,m,2*o);
build(m+1,r,2*o+1);
}

int query(int x,int l,int r,int o)
{
if(l==r)
{
Max[o]-=x;
return l;
}
int m=(l+r)/2;
int ans;
if(Max[o*2]>=x) ans=query(x,l,m,o*2);
else ans=query(x,m+1,r,o*2+1);
Max[o]=max(Max[2*o],Max[2*o+1]);
return ans;
}
int main()
{
int i;
while(scanf("%d%d%d",&h,&w,&n)!=EOF)
{
if(h>n) h=n;
build(1,h,1);
int x;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(Max[1]<x) printf("-1\n");
else printf("%d\n",query(x,1,h,1));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: