Problem : 2795 ( Billboard ) Judge Status : Accepted
RunId : 5864258 Language : C Author : qq1203456195
/* 题意:高h宽w的公告栏,往上边贴1*L的公告,在能放的区域内按照最上最左的原则 张贴。 输出:每张公告贴分别在了第几行。 ========================================================================= 每个结点存储的是当前l-r行上能贴的公告的L的最大值Max if(Max>=L)说明可以放 { if(MaxL>=L) 进入左子树; else 进入右子树; } else { 不能放,返回; } */ #include <stdio.h> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define MAX 222222 int Max[MAX<<2],n,h,w;//公告数量,高度(使用的高度不会超过n),宽度 void build(int l,int r,int rt) { int m; Max[rt]=w; if(l==r) { Max[rt]=w; return; } m=((l+r)>>1); build(lson); build(rson); } int max(int a,int b) { return a>=b?a:b;} int post(int p,int l,int r,int rt) { int m,ret=0; if (l==r) { Max[rt]-=p; return l; } m=((l+r)>>1); if(Max[rt<<1]>=p) ret=post(p,lson); else ret=post(p,rson); Max[rt]=max(Max[rt<<1],Max[rt<<1|1]); return ret; } int main() { int i,p; while (~scanf("%d%d%d",&h,&w,&n)) { if(h>n) h=n; build(1,h,1); for (i=0;i<n;i++) { scanf("%d",&p); if(Max[1]<p) printf("-1\n"); else printf("%d\n",post(p,1,h,1)); } } return 0; }