本题还是线段树单点更新的题目。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795
#include <iostream> #include <cstdio> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxx=200002; int maxn[maxx<<2];hdu int h,w,n; int max(int a,int b){ return a>b?a:b; } void build(int l,int r,int rt){ maxn[rt]=w; if(l==r) return ; int m=(l+r)>>1; build(lson); build(rson); } int query(int wi,int l,int r,int rt){ if(l==r){ maxn[rt] -= wi; return r; } int m=(l+r)>>1; int ret=0; if(maxn[rt<<1]>=wi) ret=query(wi,lson); else ret = query(wi,rson); maxn[rt]=max(maxn[rt<<1],maxn[rt<<1|1]); return ret; } int main(){ while(scanf("%d%d%d",&h,&w,&n)!=EOF){ int wi; if(h>n)h=n; build(1,h,1); while(n--){ scanf("%d",&wi); if(wi>maxn[1])printf("-1\n"); else printf("%d\n",query(wi,1,h,1)); } } return 0; }