将h与n的最小值用来作为建树的空间;
View Code
Problem : 2795 ( Billboard ) Judge Status : Accepted
RunId : 11310448 Language : G++ Author : lihaozhuzhuxia Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta #include <cstdio> #include <iostream> #include <cstring> using namespace std; struct p { int l; int r; int w; int id; }tree[888888]; int h,w; void build(int l,int r,int n) { tree[n].l=l; tree[n].r=r; tree[n].w=w; if(tree[n].l==tree[n].r) { tree[n].id=l; return; } int mid=(tree[n].l+tree[n].r)/2; build(l,mid,n*2); build(mid+1,r,n*2+1); } void change(int l,int r,int n,int k) { int mid=(tree[n].l+tree[n].r)/2; if(tree[n].l==tree[n].r) { tree[n].w+=k; return; } else if(r<=mid) { change(l,r,n*2,k); } else if(l>mid) { change(l,r,n*2+1,k); } tree[n].w=max(tree[n*2+1].w,tree[n*2].w); } int query(int l,int r,int n,int k) { int mid=(tree[n].l+tree[n].r)/2; if(tree[n].w<k) return -1; if(tree[n].l==tree[n].r) return tree[n].id; if(tree[n*2].w>=k) return query(l,mid,n*2,k); else if(tree[n*2+1].w>=k) return query(mid+1,r,n*2+1,k); } int main() { int i,j,k,l,n,m,t; while(scanf("%d%d%d",&h,&w,&n)==3) { t=h; if(t>n) t=n; build(1,t,1); for(i=0;i<n;i++) { scanf("%d",&k); m=query(1,t,1,k); printf("%d\n",m); //cout<<tree[4].w; if(m!=-1) change(m,m,1,-k); } } return 0; } |