题意:
给出一个高h,宽w的板子,要写n条长为x的广告,问从1->h 可以写在哪个位置。
思路:
第一次写的时候没注意数据 造了个4*h的线段树,果断RE,再想了想n的数据很小,如果依据n来构造线段树,就解决了
在构造的时候注意左,右子树的val值的更新,以及构建当前树是几号,还有就是在当前节点如果max( 左,右) < 我们需要的宽度 就返回-1.
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#define lson i<<1,left,mid
#define rson i<<1|1,mid+1,right
using namespace std;
int h,w,n;
int ans=0,cnt;
struct TreeNode
{
int left_val,right_val,val,left,right,num;
} Tree[800005];
void Build(int i , int left , int right )
{
Tree[i].left=left;
Tree[i].right=right;
if(left==right)
{
Tree[i].num=++cnt;
Tree[i].val=w;
return ;
}
int mid=(left+right)>>1;
Build(lson);
Build(rson);
Tree[i].val=max(Tree[i<<1].val,Tree[i<<1|1].val);
Tree[i].left_val=Tree[i<<1].val;
Tree[i].right_val=Tree[i<<1|1].val;
}
void update(int i,int val)
{
if(Tree[i].val<val||Tree[i].num>h)
{
ans=-1;
return ;
}
if(Tree[i].left== Tree[i].right )
{
Tree[i].val-=val;
ans=Tree[i].num;
return ;
}
if(val<=Tree[i].left_val)
{
update(i<<1 ,val);
}
else
{
update(i<<1|1 ,val);
}
Tree[i].left_val=Tree[i<<1].val;
Tree[i].right_val=Tree[i<<1|1].val;
Tree[i].val=max(Tree[i<<1].val,Tree[i<<1|1].val);
}
int main()
{
int x;
while(~scanf("%d%d%d",&h,&w,&n))
{
cnt=0;
Build(1,1,n);
while(n--)
{
scanf("%d",&x);
ans=0;
update(1,x);
printf("%d\n",ans);
}
}
return 0;
}
/*
1 5 2
5
1
*/