主要是利用线段树能求区间最大值的性质完成这样一个功能 “查询最靠前能容纳广告的位置“ 将位置用来建树(实际上h<=n) 树中存位置还拥有的空间,若左子树的最大值大于他
就进入左子树,否则进入右子树。
#include<stdio.h> #define maxn 200005 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int MAX[maxn<<2],h,w,n; int build(int l,int r,int rt) { MAX[rt]=w; if(l==r) return 0; int m=(l+r)>>1; build(lson); build(rson); } int Pushup(int rt) { MAX[rt]=MAX[rt<<1]>MAX[rt<<1|1]?MAX[rt<<1]:MAX[rt<<1|1]; } int query(int x,int l,int r,int rt) { int ret,m; m=(l+r)>>1; if(l==r) { MAX[rt]-=x;return l;} else ret=MAX[rt<<1]>=x?query(x,lson):query(x,rson); Pushup(rt); return ret; } int main() { int i,temp; while(~scanf("%d%d%d",&h,&w,&n)){ if(h>n) h=n; build(1,h,1); for(i=1;i<=n;i++) { scanf("%d",&temp); if(MAX[1]<temp) printf("-1\n"); else printf("%d\n",query(temp,1,h,1)); } } return 0; }