hdu2795(线段树单点更新)

来源:互联网 发布:如何减去腹部赘肉 知乎 编辑:程序博客网 时间:2024/05/16 04:41

每个节点维护所包含区间剩余空间的最大值

#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;}

0 0
原创粉丝点击