hdu 2795 Billboard
题意: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; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步