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;
}
posted @ 2020-03-31 16:12  Pecoz  阅读(91)  评论(0编辑  收藏  举报