题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子
思路:总共有h个叶节点,表示有h个区间,线段树的一个域表示该区间还能容纳的最大物品,每次找到最大值的位子(先找左边),然后减去L
线段树功能:query:区间求最大值的位子(直接把update的操作在query里做了)
#include<iostream> #include<algorithm> #define MAXN 222222 using namespace std; int p[MAXN*4]; int query(int k,int x,int s,int t) { if(s==t) { p[k]-=x; return s; } int kl=k<<1,kr=kl+1,mid=(s+t)>>1; int ans; if(p[kl]>=x) ans=query(kl,x,s,mid); else ans=query(kr,x,mid+1,t); p[k]=max(p[kl],p[kr]); return ans; } int main() { int h,w,n,len; while(scanf("%d %d %d",&h,&w,&n)==3) { if(h>n) h=n; for(int i=1;i<MAXN*4;i++) p[i]=w; while(n--) { scanf("%d",&len); if(p[1]<len) { puts("-1"); continue; } printf("%d\n",query(1,len,1,h)); } } return 0; }