HDU 2795 Billboard(线段树)
比赛时对这种线段树裸题都不够敏感,还是题做的太少了啊
因为前面有道题和这题内存限制一样爆内存了,这题一看数据也以为会爆,其实还是没认真去想,因为 n 次询问的范围很小,所以最多也就用 n 行,并不会爆内存
不过赛后自己不看题解也还是不会啊
#include<bits/stdc++.h>
using namespace std;
struct p
{
int l,r,len;
}t[800005];
void build(int p,int l,int r,int w)
{
t[p].l=l,t[p].r=r;
t[p].len=w;
if(l==r)
{
return ;
}
int mid=l+r>>1;
build(p<<1,l,mid,w);
build(p<<1|1,mid+1,r,w);
// t[p].len=max(t[p<<1].len,t[p<<1|1].len);
}
void change(int p,int k)
{
if(t[p].l==t[p].r)
{
printf("%d\n",t[p].l);
t[p].len-=k;
return ;
}
if(k<=t[p<<1].len)//这里因为要先贴上面的,所以先和t[p<<1].len比较
change(p<<1,k);
else
change(p<<1|1,k);
t[p].len=max(t[p<<1].len,t[p<<1|1].len);
}
int main()
{
int h,w,n;
while(cin>>h>>w>>n)
{
build(1,1,min(h,n),w);
int k;
for(int i=1;i<=n;i++)
{
scanf("%d",&k);
if(k>t[1].len)//直接看能不能把 k 大小贴上,不行输出 -1
printf("-1\n");
else
change(1,k);
}
}
return 0;
}
戒骄戒躁,百炼成钢!