hdu~2795~线段树

来源:互联网 发布:蓝鸥unity3d培训多少钱 编辑:程序博客网 时间:2024/05/01 11:04

很简单的线段树,先将h缩小,然后记录每一行用过的长度,每次优先左边查找就OK了。


ACcode:

#include<stdio.h>#include<iostream>#define Min(a,b) a<b?a:b using namespace std;const int size=200000;int len[size<<2];int h,w,n,v,pos;void pushup(int rt){     len[rt]=Min(len[rt<<1],len[rt<<1|1]);}void update(int rt,int l,int r,int wd){     if ((len[rt]+wd)>w) return ;      if (l==r)     {        len[rt]+=wd;        pos=r;        return ;              }     int mid=(l+r)>>1;     if ((len[rt<<1]+wd)<=w) update(rt<<1,l,mid,wd);     else update(rt<<1|1,mid+1,r,wd);     pushup(rt); }int main(){    int i;    while (scanf("%d %d %d",&h,&w,&n)!=EOF)    {          h=h<size?h:size;          memset(len,0,sizeof(len));          for (i=1;i<=n;i++)          {              scanf("%d",&v);              pos=-1,update(1,1,h,v);                  printf("%d\n",pos);          }          }    return 0;   }