hdu2795(线段树单点更新)
2016-09-22 19:37
344 查看
每个节点维护所包含区间剩余空间的最大值
#include<algorithm> #include<iostream> #include<cstdio> using namespace std; int a[200005]; int tree[200005*4]; int h,w,n; void Pushup(int p) { tree[p]=max(tree[p<<1],tree[p<<1|1]); //记录其子树中已经出现的点的数量 } void Build(int p,int l,int r) { if(l==r){ tree[p]=w; return; } int mid=(l+r)/2; Build(p<<1,l,mid); Build(p<<1|1,mid+1,r); Pushup(p); } int Update(int p,int l,int r,int x) { if(l==r){ tree[p]-=x; return l;} //更新叶子节点,即每条宽的长 int mid=(l+r)/2; int ret; if(tree[p<<1]>=x) ret=Update(p<<1,l,mid,x); else ret=Update(p<<1|1,mid+1,r,x); Pushup(p); //更新当前节点 return ret; } /* int Query(int p,int l,int r,int x,int y) { if(x<=l&&y>=r) return tree[p]; int mid=(l+r)/2; if(y<=mid) return Query(p<<1,l,mid,x,y); else if(x>mid) return Query(p<<1|1,mid+1,r,x,y); else return (Query(p<<1,l,mid,x,mid)+Query(p<<1|1,mid+1,r,mid+1,y)); } */ int main() { int n,m; while(scanf("%d%d%d",&h,&w,&n)!=EOF) { if(h>n) h=n; Build(1,1,h); int sum=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(tree[1]<a[i]) puts("-1"); else printf("%d\n",Update(1,1,h,a[i])); } } return 0; }
相关文章推荐
- hdu2795 Billboard (线段树,单点更新)
- HDU2795 Billboard(线段树单点更新,区间最大值)
- hdu2795(线段树单点更新&区间最值)
- hdu2795 Billboard 线段树单点更新区间最值
- HDU2795:Billboard(线段树单点更新)
- HDU2795 Billboard 【线段树】+【单点更新】
- hdu2795 Billboard(线段树,单点更新)
- hdu2795(线段树单点更新)
- HDU2795 Billboard 线段树 单点更新
- 【HDU - 1540】Tunnel Warfare 【线段树+单点更新+区间合并】
- NYOJ 123 士兵杀敌(四)(线段树--区间更新+单点查询)
- Minimum Inversion Number----HDU_1394----线段树之单点更新
- HDU 3308 线段树 最长连续上升子序列 单点更新 区间查询
- Who Gets the Most Candies?----POJ_2886----线段树之单点更新
- HDOJ 1166 敌兵布阵 线段树: 单点更新 成段求和
- Balanced Lineup POJ - 3264 (线段树单点更新)
- zoj 3772 线段树--单点更新
- ACM_线段树模板(单点更新)
- HDU 1754 I Hate It【线段树 单点更新】
- A - 加农炮(线段树)单点更新