hdu2795 Billboard
主要是利用线段树能求区间最大值的性质完成这样一个功能 “查询最靠前能容纳广告的位置“ 将位置用来建树(实际上h<=n) 树中存位置还拥有的空间,若左子树的最大值大于他
就进入左子树,否则进入右子树。
#include<stdio.h>
#define maxn 200005
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int MAX[maxn<<2],h,w,n;
int build(int l,int r,int rt)
{
MAX[rt]=w;
if(l==r) return 0;
int m=(l+r)>>1;
build(lson);
build(rson);
}
int Pushup(int rt)
{
MAX[rt]=MAX[rt<<1]>MAX[rt<<1|1]?MAX[rt<<1]:MAX[rt<<1|1];
}
int query(int x,int l,int r,int rt)
{
int ret,m;
m=(l+r)>>1;
if(l==r) { MAX[rt]-=x;return l;}
else ret=MAX[rt<<1]>=x?query(x,lson):query(x,rson);
Pushup(rt);
return ret;
}
int main()
{
int i,temp;
while(~scanf("%d%d%d",&h,&w,&n)){
if(h>n) h=n;
build(1,h,1);
for(i=1;i<=n;i++)
{
scanf("%d",&temp);
if(MAX[1]<temp) printf("-1\n");
else printf("%d\n",query(temp,1,h,1));
}
}
return 0;
}
浙公网安备 33010602011771号