hdu2795Billboard (线段树,看作点更新)
Problem DescriptionInputOutputSample InputSample Output#include<stdio.h>#define N 200005int tree[4*N];int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}void builde(int l,int r,int k,int w){ int m=(l+r)/2; tree[k]=w; if(l==r) return ; builde(l,m,k*2,w); builde(m+1,r,k*2+1,w);}int loc;void updata(int l,int r,int k,int tw){ int m=(l+r)/2; if(l==r&&tree[k]>=tw) {loc=l;tree[k]-=tw;return ;} if(tree[k*2]>=tw) updata(l,m,k*2,tw); else if(tree[k*2+1]>=tw) updata(m+1,r,k*2+1,tw); tree[k]=max(tree[k*2],tree[k*2+1]);}int main(){ int h,w,n,m; while(scanf("%d%d%d",&h,&w,&m)>0) { n=min(h,m); builde(1,n,1,w); while(m--) { loc=-1; scanf("%d",&w); updata(1,n,1,w); printf("%d\n",loc); } }}