HDU 2795 Billboard线段树
2012-02-07 16:53
253 查看
首先把线段树建好,这个题就很简单了。
#include<cstdio> #include<cstdlib> #include<cstring> typedef long long ll; int h,w,n,k; struct Tree{ int s; int t; int max; }tree[540010]; void build(int s,int t,int id){ tree[id].s=s; tree[id].t=t; tree[id].max=w; if(s!=t){ int mid=(tree[id].s+tree[id].t)>>1; build(s,mid,id*2); build(mid+1,t,id*2+1); } } void insert(int s,int id,int colour){ if(tree[id].s==s && tree[id].t==s){ tree[id].max+=colour; return ; } int mid=(tree[id].s+tree[id].t)>>1; if(mid<s) insert(s,id*2+1,colour); else insert(s,id*2,colour); tree[id].max=tree[id*2].max>tree[id*2+1].max?tree[id*2].max:tree[id*2+1].max; } int query(int s,int id){ if(tree[id].max<s) return -1; if(tree[id].s==tree[id].t){ return tree[id].s; } int mid=(tree[id].s+tree[id].t)>>1; if(tree[id*2].max>=s) return query(s,id*2); else return query(s,id*2+1); } int main(){ int i; while(scanf("%d %d %d",&h,&w,&n)==3){ k=h>n?n:h; build(1,k,1); for(i=1;i<=n;i++){ int tem; scanf("%d",&tem); int e=query(tem,1); printf("%d\n",e); if(e!=-1) insert(e,1,-tem); } } }
相关文章推荐
- HDU 2795 Billboard(线段树-水题,模板题)
- HDU 2795 Billboard (线段树 单点更新, 询问位置)
- HDU-2795-Billboard(线段树 点更新求最值)
- [ACM] hdu 2795 Billboard (线段树)
- HDU_2795 Billboard(线段树)
- HDU 2795 Billboard——特殊查询的线段树
- hdu 2795 Billboard(线段树单点更新)
- hdu 2795 billboard(线段树)
- hdu2795 Billboard(线段树)
- hdu2795 Billboard 线段树
- HDU 2795 Billboard (线段树,单点查询)
- Billboard----HDU_2795----线段树之单点更新
- hdu-2795-Billboard- 线段树-单点
- HDU 2795 Billboard 线段树单点更新
- HDU 2795 Billboard (线段树+贪心)
- hdu 2795 Billboard 线段树
- hdu 2795 Billboard(线段树)
- hdu 2795 Billboard 线段树
- Hdu 2795-Billboard【线段树 优化】
- hdu 2795 Billboard 线段树变形