以高为数轴,维护每个区间的剩余最大值,用线段树二分做
#include <stdio.h> #define maxn 200100 int Max[4*maxn]; int h,w,n; int max(int a,int b) { if(a>b) return a; else return b; } void build(int l,int r,int o) { Max[o]=w; if(l==r) return ; int m=(l+r)/2; build(l,m,2*o); build(m+1,r,2*o+1); } int query(int x,int l,int r,int o) { if(l==r) { Max[o]-=x; return l; } int m=(l+r)/2; int ans; if(Max[o*2]>=x) ans=query(x,l,m,o*2); else ans=query(x,m+1,r,o*2+1); Max[o]=max(Max[2*o],Max[2*o+1]); return ans; } int main() { int i; while(scanf("%d%d%d",&h,&w,&n)!=EOF) { if(h>n) h=n; build(1,h,1); int x; for(i=1;i<=n;i++) { scanf("%d",&x); if(Max[1]<x) printf("-1 "); else printf("%d ",query(x,1,h,1)); } } return 0; }