POJ 3667 Hotel(线段树+区间合并+延迟标记)

延迟标记很重要,没有延迟标记,时间复杂度还是O(n)。

//
//  main.cpp
//  Richard
//
//  Created by 邵金杰 on 16/8/21.
//  Copyright © 2016年 邵金杰. All rights reserved.
//



#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=50000+100;
struct node{
    int l,r;
    int lsum,rsum,sum;
    int mark;
    int getlen() {return r-l+1;}
    void getsum() {lsum=rsum=sum=(mark?0:getlen());}
}tree[maxn*4];
int getmid(int l,int r) {return (l+r)>>1;}
void BuildTree(int p,int l,int r)
{
    tree[p].l=l;
    tree[p].r=r;
    tree[p].mark=0;
    tree[p].sum=tree[p].lsum=tree[p].rsum=tree[p].getlen();
    if(l==r) return ;
    int mid=getmid(l,r);
    BuildTree(p*2,l,mid);
    BuildTree(p*2+1,mid+1,r);
}
int query(int p,int x)
{
//    cout<<p<<endl;
    if(tree[p].l==tree[p].r&&x==1)
        return tree[p].l;
    if(tree[p].mark!=-1)
    {
        tree[p*2].mark=tree[p*2+1].mark=tree[p].mark;
        tree[p].mark=-1;
        tree[p*2].getsum();
        tree[p*2+1].getsum();
    }
    if(tree[p*2].sum>=x) return query(p*2,x);
    else if(tree[p*2].rsum+tree[p*2+1].lsum>=x) return tree[p*2].r-tree[p*2].rsum+1;
    else if(tree[p*2+1].sum>=x) return query(p*2+1,x);
    else return 0;
}
void modify(int p,int l,int r,int mark)
{
    if(tree[p].l==l&&tree[p].r==r)
    {
        tree[p].mark=mark;
        tree[p].getsum();
        return ;
    }
    if(tree[p].mark!=-1)
    {
        tree[p*2].mark=tree[p*2+1].mark=tree[p].mark;
        tree[p].mark=-1;
        tree[p*2].getsum();
        tree[p*2+1].getsum();
    }
    int mid=getmid(tree[p].l,tree[p].r);
    if(r<=mid) modify(p*2,l,r,mark);
    else if(l>mid) modify(p*2+1,l,r,mark);
    else{
        modify(p*2,l,mid,mark);
        modify(p*2+1,mid+1,r,mark);
    }
    int temp=max(tree[p*2].sum,tree[p*2+1].sum);
    tree[p].sum=max(temp,tree[p*2].rsum+tree[p*2+1].lsum);
    tree[p].lsum=tree[p*2].lsum;
    tree[p].rsum=tree[p*2+1].rsum;
    if(tree[p*2].sum==tree[p*2].getlen()) tree[p].lsum+=tree[p*2+1].lsum;
    if(tree[p*2+1].sum==tree[p*2+1].getlen()) tree[p].rsum+=tree[p*2].rsum;
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int cmd,a,b;
        BuildTree(1,1,n);
        for(int i=0;i<m;i++)
        {
            scanf("%d",&cmd);
            if(cmd==1)
            {
                scanf("%d",&a);
                int p=query(1,a);
                printf("%d\n",p);
                if(p) modify(1,p,p+a-1,1);
            }
            else
            {
                scanf("%d%d",&a,&b);
                modify(1,a,a+b-1,0);
            }
        }
    }
    return 0;
}


基于SSM框架的网红酒店预定系统,是一个集前台用户操作和后台管理员管理于一体的综合性平台。该系统旨在通过信息化手段,提高酒店预订的效率和用户体验。 系统的主要功能模块包括: 1. **用户管理**:允许用户注册、登录,查看个人信息,以及修改个人资料和密码。 2. **客房管理**:管理员可以添加、删除或修改客房信息,包括房型、价格、设施等。 3. **预订管理**:用户可以浏览可用房型,进行预订操作,管理员则可以管理预订订单,包括确认预订、办理入住和退房等。 4. **退订管理**:用户和管理员都可以处理预订的取消,管理员可以审核退订请求。 5. **系统管理**:管理员可以进行系统设置,包括权限管理、日志查看等。 系统的设计考虑了用户体验和管理员的便捷性,通过SSM框架的灵活性和MySQL数据库的稳定性,实现了数据的高效管理和处理。系统的前端界面友好,操作流程简洁,能够满足用户快速预订和查询的需求。同时,系统的后台管理功能强大,能够为管理员提供全面的数据分析和决策支持。 此外,系统还具有高度的安全性和稳定性,通过角色权限控制,确保了数据的安全性和系统的稳定运行。系统的开发和设计,不仅提升了网红酒店的品牌形象,也为用户带来了便捷的预订体验,进一步推动了酒店行业的信息化发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值