POJ.3667 Hotel ( 线段树 )

来源:互联网 发布:吉郎pop美工族手册 编辑:程序博客网 时间:2024/05/21 12:46

POJ.3667 Hotel ( 线段树 )

题意分析

还需要好好理解一下

代码总览

#include <cstdio>#include <cstring>#include <algorithm>#define nmax 200010using namespace std;struct Tree{    int l,r;    int lenmax;    int llen,rlen;    int lazy;    int mid(){        return (l+r)>>1;    }    int interval_len(){        return (r-l+1);    }    void update_len(){        lenmax = llen = rlen = (lazy ?0:interval_len());    }};Tree tree[nmax<<2];int ans = 0;void PushUp(int rt){    int tmp = max(tree[rt<<1].lenmax,tree[rt<<1|1].lenmax);    tree[rt].lenmax = max(tmp, (tree[rt<<1].rlen + tree[rt<<1|1].llen));    tree[rt].llen = tree[rt<<1].llen;    tree[rt].rlen = tree[rt<<1|1].rlen;    if(tree[rt<<1].lenmax == tree[rt<<1].interval_len()){        tree[rt].llen += tree[rt<<1|1].llen;    }    if(tree[rt<<1|1].lenmax == tree[rt<<1|1].interval_len()){        tree[rt].rlen += tree[rt<<1].rlen;    }}void PushDown(int rt){    tree[rt<<1].lazy = tree[rt<<1|1].lazy = tree[rt].lazy;    tree[rt].lazy = -1;    tree[rt<<1].update_len();    tree[rt<<1|1].update_len();}void Build(int l, int r, int rt){    tree[rt].l = l; tree[rt].r = r;    tree[rt].lenmax = tree[rt].llen = tree[rt].rlen = tree[rt].interval_len();    tree[rt].lazy = 0;    if(l == r){        return;    }    Build(l,tree[rt].mid(),rt<<1);    Build(tree[rt].mid()+1,r,rt<<1|1);    //PushUp(rt);}void UpdateInterval(int val, int l, int r, int rt){    //if(tree[rt].l >r || tree[rt].r < l) return;    if(tree[rt].l == l && tree[rt].r == r){        tree[rt].lazy = val;        tree[rt].update_len();        return;    }    if(tree[rt].lazy != -1) PushDown(rt);    if(l>tree[rt].mid()){        UpdateInterval(val,l,r,rt<<1|1);    }else if(r <=tree[rt].mid()){        UpdateInterval(val,l,r,rt<<1);    }else{        UpdateInterval(val,l,tree[rt].mid(),rt<<1);        UpdateInterval(val,tree[rt].mid() +1,r,rt<<1|1);    }    PushUp(rt);}int Query(int val ,int rt){    if(tree[rt].l == tree[rt].r && val == 1)        return tree[rt].l;    if(tree[rt].lazy != -1) PushDown(rt);    if(tree[rt<<1].lenmax >= val){        return Query(val,rt<<1);    }else if(tree[rt<<1].rlen + tree[rt<<1|1].llen >= val){        return tree[rt<<1].r - tree[rt<<1].rlen + 1;    }else if(tree[rt<<1|1].lenmax >= val){        return Query(val,rt<<1|1);    }else{        return 0;    }}int main(){    //freopen("in3667.txt","r",stdin);    int n,m,w,index;    scanf("%d%d",&n,&m);    Build(1,n,1);    while(m--){        int op;        scanf("%d",&op);        if(op == 1){            scanf("%d",&w);            index = Query(w,1);            printf("%d\n",index);            if(index) UpdateInterval(1,index,index+w-1,1);        }else{            int l,len;            scanf("%d%d",&l,&len);            UpdateInterval(0,l,l+len-1,1);        }    }    return 0;}
原创粉丝点击