• POJ 3667 :线段树


    N个房间,入住的人只能安排连续的房间

    莫名其妙T了半天- -||query函数没写好~虽然我觉得我写得挺对的,就是不让过

    #include"cstdio"
    #include"queue"
    #include"cmath"
    #include"stack"
    #include"iostream"
    #include"algorithm"
    #include"cstring"
    #include"queue"
    #include"map"
    #include"set"
    #include"vector"
    #define ll long long
    #define mems(a,b) memset(a,b,sizeof(a))
    #define ls pos<<1
    #define rs pos<<1|1
    
    using namespace std;
    const int MAXN = 80500;
    const int MAXE = 200500;
    const int INF = 0x3f3f3f3f;
    
    struct Node{
        int l,r;
        int len;
        int lazy;
        int maxz;///连续空
        int p;  ///最大连续空的起始位置
        int lz,rz;///左连续 右连续
    }node[MAXN<<2];
    
    void debug(int pos){
        cout<<node[pos].l<<'	'<<node[pos].r<<endl;
        cout<<"maxz:"<<node[pos].maxz<<endl;
        cout<<"p:"<<node[pos].p<<endl;
        cout<<"lz:"<<node[pos].lz<<endl;
        cout<<"rz:"<<node[pos].rz<<endl;
    }
    
    void pushup(int pos){
        if(node[ls].maxz==node[ls].len) node[pos].lz=node[ls].len+node[rs].lz;
        else node[pos].lz=node[ls].lz;
        if(node[rs].maxz==node[rs].len) node[pos].rz=node[rs].len+node[ls].rz;
        else node[pos].rz=node[rs].rz;
    
        node[pos].maxz=max(node[ls].maxz,node[rs].maxz);
        node[pos].p=node[ls].maxz>=node[rs].maxz?node[ls].p:node[rs].p;
        node[pos].maxz=max(node[pos].maxz,node[ls].rz+node[rs].lz);
        if(node[ls].rz+node[rs].lz>=node[pos].maxz) node[pos].p=min(node[pos].p,node[ls].r-node[ls].rz+1);
    }
    
    void pushdown(int pos){
        int &t=node[pos].lazy;
        if(t!=-1){
            node[ls].lazy=node[rs].lazy=t;
            if(!t){
                node[ls].maxz=node[ls].lz=node[ls].rz=node[ls].len;
                node[ls].p=node[ls].l;
                node[rs].maxz=node[rs].lz=node[rs].rz=node[rs].len;
                node[rs].p=node[rs].l;
            }
            else{
                node[ls].maxz=node[ls].lz=node[ls].rz=0;
                node[ls].p=node[ls].r+1;///不存在
                node[rs].maxz=node[rs].lz=node[rs].rz=0;
                node[rs].p=node[rs].r+1;
            }
            t=-1;
        }
    }
    
    void build(int l,int r,int pos){
        node[pos].l=l;
        node[pos].r=r;
        node[pos].lazy=-1;
        node[pos].len=node[pos].lz=node[pos].rz=node[pos].maxz=r-l+1;
        node[pos].p=l;
        if(l==r) return;
        int mid=(l+r)>>1;
        build(l,mid,ls);
        build(mid+1,r,rs);
        pushup(pos);
    }
    
    void update(int l,int r,int pos,int k){
        if(l<=node[pos].l&&node[pos].r<=r){
            node[pos].lazy=k;
            if(!k){
                node[pos].maxz=node[pos].lz=node[pos].rz=node[pos].len;
                node[pos].p=node[pos].l;
            }
            else{
                node[pos].maxz=node[pos].lz=node[pos].rz=0;
                node[pos].p=node[pos].r+1;///不存在
            }
            return;
        }
        pushdown(pos);
        int mid=(node[pos].l+node[pos].r)>>1;
        if(l<=mid) update(l,r,ls,k);
        if(r>mid) update(l,r,rs,k);
        pushup(pos);
    }
    
    int query(int k,int pos){
        if(node[pos].l==node[pos].r) return node[pos].l;
        pushdown(pos);
        int mid=(node[pos].l+node[pos].r)>>1;
        if(node[ls].maxz>=k) return query(k,ls);    ///房间尽量靠左
        else if(node[ls].rz+node[rs].lz>=k) return node[ls].r-node[ls].rz+1;///房间尽量靠左
        else return query(k,rs);
    }
    /*int query(int k,int pos){
        if(node[pos].maxz<k) return INF;
        if(node[pos].l==node[pos].r) return node[pos].l;
        pushdown(pos);
        int a=query(k,ls);
        int b=query(k,rs);
        int c=node[pos].p;
        if(node[ls].rz+node[rs].lz>=k) c=min(c,node[ls].r-node[ls].rz+1);
        return min(c,min(a,b));
    }*/
    int main(){
        //freopen("in.txt","r",stdin);
        //freopen("pending.txt","w",stdout);
        int n,m;
        while(~scanf("%d%d",&n,&m)){
            build(1,n,1);
            for(int i=0;i<m;i++){
                int op,a,b;
                scanf("%d",&op);
                if(op==1){
                    scanf("%d",&a);
                    if(node[1].maxz<a) printf("0
    ");
                    else{
                        b=query(a,1);
                        printf("%d
    ",b);
                        update(b,b+a-1,1,1);
                    }
                }
                else{
                    scanf("%d%d",&a,&b);
                    update(a,a+b-1,1,0);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    当前流行的智能硬件产品整理
    一个桌面视频录制利器推荐--Snagit
    微信支付---退款的坑
    微信支付退款证书服务器配置
    Git安装和TortoiseGit详细使用教程【基础篇】
    通俗易懂,什么是.NET Core以及.NET Core能做什么
    向ASP.NET Core迁移
    SQLServer 查看SQL语句的执行时间
    SqlServer 2014 Enterprise 企业版下载与安装教程(附图片)
    SQL Server表分区
  • 原文地址:https://www.cnblogs.com/luxiaoming/p/5140320.html
Copyright © 2020-2023  润新知