栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 3667 Hotel

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 3667 Hotel

#include <cstdio>#include <cstring>#define lch(i) ((i)<<1)#define rch(i) ((i)<<1|1)#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))#define N  50010#define INF  0x3f3f3f3fstruct node{    int l,r;    int mark;    int tlen,llen,rlen;    int mid(){        return (l+r)>>1;    }    int cal_len(){        return r-l+1;    }    void updata_len(){        tlen = llen = rlen = ( mark ? 0 : cal_len() );    }}t[4*N];void build(int l ,int r ,int rt){    t[rt].l = l; t[rt].r = r;     t[rt].tlen = t[rt].llen = t[rt].rlen = t[rt].cal_len();    t[rt].mark = 0;    if(l == r) return ;    int mid = t[rt].mid();    build(l , mid , lch(rt));    build(mid+1 , r , rch(rt));    return ;}int query(int w ,int rt){    if(t[rt].l == t[rt].r && w == 1) //叶子特判        return t[rt].l;    if(t[rt].mark != -1) //延迟标记,父亲信息传递给儿子    {        t[lch(rt)].mark = t[rch(rt)].mark = t[rt].mark;        t[rt].mark = -1;        t[lch(rt)].updata_len(); //传递信息后更新孩子的区间覆盖情况        t[rch(rt)].updata_len(); //传递信息后更新孩子的区间覆盖情况    }    if(t[lch(rt)].tlen >= w) //左孩子的可用区间可以满足,那么一定在左孩子区间内        return query(w , lch(rt));    else if(t[lch(rt)].rlen + t[rch(rt)].llen >= w) //横跨左右孩子且连续的区间可以满足,那么可以直接返回下标        return ( t[lch(rt)].r - t[lch(rt)].rlen + 1 );    else if(t[rch(rt)].tlen >= w) //右孩子的可用区间可以满足,那么去右孩子处找        return query(w , rch(rt));    else //找不到可用的区间        return 0;}void updata(int l ,int r ,int val ,int rt){    if(t[rt].l == l && t[rt].r == r)    {        t[rt].mark = val;        t[rt].updata_len();        return ;    }    if(t[rt].mark != -1) //延迟标记,父亲信息传递给儿子    {        t[lch(rt)].mark = t[rch(rt)].mark = t[rt].mark;        t[rt].mark = -1;        t[lch(rt)].updata_len(); //传递信息后更新孩子的区间覆盖情况        t[rch(rt)].updata_len(); //传递信息后更新孩子的区间覆盖情况    }    int mid = t[rt].mid();    if(l > mid) //修改的区间在右孩子        updata(l , r , val , rch(rt));    else if(r <= mid) //修改的区间在左孩子        updata(l , r , val , lch(rt));    else    {        updata(l , mid , val , lch(rt));        updata(mid+1 , r , val , rch(rt));    }    int tmp = max(t[lch(rt)].tlen , t[rch(rt)].tlen);    t[rt].tlen = max(tmp , t[lch(rt)].rlen + t[rch(rt)].llen);    t[rt].llen = t[lch(rt)].llen;    t[rt].rlen = t[rch(rt)].rlen;    if(t[lch(rt)].tlen == t[lch(rt)].cal_len() )        t[rt].llen += t[rch(rt)].llen;    if(t[rch(rt)].tlen == t[rch(rt)].cal_len() )        t[rt].rlen += t[lch(rt)].rlen;    return ;}int main(){    int n,m;    scanf("%d%d",&n,&m);    build(1,n,1);    while(m--)    {        int choose;        scanf("%d",&choose);        if(choose == 1)         { int w; scanf("%d",&w); int index = query(w,1); printf("%dn",index); if(index)     updata(index , index+w-1 , 1 , 1);        }        else        { int l,len; scanf("%d%d",&l,&len); updata(l , l+len-1 , 0 , 1);        }    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/374727.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号