C. Hotel 旅馆

内存限制:256 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
 

题目描述

OIER最近的旅游计划,是到长春净月潭,享受那里的湖光山色,以及明媚的阳光。作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿。这个巨大的旅馆一共有N

间客房,它们在同一层楼中顺次一字排开,在任何一个房间里,只需要拉开窗帘,就能见到波光粼粼的湖面。 所有的旅游者,都是一批批地来到旅馆的服务台,希望能订到 间连续的房间。服务台的接待工作也很简单:如果存在r满足编号为 的房间均空着,他就将这一批顾客安排到这些房间入住;如果没有满足条件的r,他会道歉说没有足够的空房间,请顾客们另找一家宾馆。如果有多个满足条件的r,服务员会选择其中最小的一个。 旅馆中的退房服务也是批量进行的。每一个退房请求由2个数字 、 描述,表示编号为 房间中的客人全部离开。退房前,请求退掉的房间中的一些,甚至是所有,可能本来就无人入住。 而你的工作,就是写一个程序,帮服务员为旅客安排房间。你的程序一共需要处理

个按输入次序到来的住店或退房的请求。第一个请求到来前,旅店中所有房间都是空闲的。

输入格式

第1行: 2个用空格隔开的整数:N、M

第2..M+1行: 第i+1描述了第i个请求,如果它是一个订房请求,则用2个数字 1、

描述,数字间用空格隔开;如果它是一个退房请求,用3 个以空格隔开的数字

、 、 描述

输出格式

第1..??行: 对于每个订房请求,输出1个独占1行的数字:如果请求能被满足 ,输出满足条件的最小的r;如果请求无法被满足,输出0

样例

样例输入

10 6
1 3
1 3
1 3
1 3
2 5 5
1 6

样例输出

1
4
7
0
5


线段树区间合并裸题 我们设这样几个数组 : max_near、max_l、max_r、lazy来分别表示区间最大连续长度,从左开始的最大连续长度,从右开始的区间最大连续长度、懒度标记 
 
这样 我们的max_near就是max(max(max_near[lc],max_near[rc]),max_r[lc]+max_r[lc]) 对于max_l的维护,若左儿子的max_next等于len,那么就是左儿子的len加右儿子max_l,否则是左儿子的max_l,max_r类似。
 
对于每次查询,如果max_near[root] < query ,那么直接输出0即可,否则的话以 左子树? 左子树右加右子树左 ? 右子树的顺序选择递归,返回ans并从ans+query的区间范围对树进行修改。


代码:
#include<bits/stdc++.h>
#define re register int
using namespace std;
int n,m,o;
int a,d,x,maxx;
int max_near[500100],max_l[500100],max_r[500100],len[500100],lazy[500100],cl[500100],cr[500100];
void pp(int k)
{
    max_l[k]=max_l[k<<1];
    max_r[k]=max_r[k<<1|1];
    if(max_l[k]==(cr[k<<1]-cl[k<<1]+1))
        max_l[k]+=max_l[k<<1|1];
    if(max_r[k]==(cr[k<<1|1]-cl[k<<1|1]+1))
        max_r[k]+=max_r[k<<1];
    max_near[k]=max(max_r[k<<1]+max_l[k<<1|1],max(max_near[k<<1],max_near[k<<1|1]));
    
    /*
        错误搞法
    len[k]=len[k<<1]+len[k<<1|1];
    
    max_l[k]=(max_near[k<<1]==len[k<<1])?(len[k<<1]+max_l[k<<1|1]):max_l[k<<1];
    
    max_r[k]=(max_near[k<<1|1]==len[k<<1|1])?(len[k<<1|1]+max_r[k<<1]):max_r[k<<1|1];
    max_near[k]=max_r[k<<1]+max_l[k<<1|1];
    
    */
    return;
}
void build(int k,int l,int r)
{
    cl[k]=l;
    cr[k]=r;
    lazy[k]=-1;
    if(l==r)
    {
        max_l[k]=max_r[k]=max_near[k]=len[k]=1;
        return;
    }
    int m=(l+r)>>1;
    build(k<<1,l,m);
    build(k<<1|1,m+1,r);
    pp(k);
}
void pushdown(int r,int lc,int rc)
{
    if(lazy[r]!=-1)
    {
        lazy[lc]=lazy[rc]=lazy[r];
        if(lazy[r])
        {
            max_near[lc]=max_l[lc]=max_r[lc]=len[lc]=0;
            max_near[rc]=max_l[rc]=max_r[rc]=len[rc]=0;
        }
        else
        {
            max_near[lc]=max_l[lc]=max_r[lc]=len[lc]=cr[lc]-cl[lc]+1;
            max_near[rc]=max_l[rc]=max_r[rc]=len[rc]=cr[rc]-cl[rc]+1;
        }
        lazy[r]=-1;
    }
}
int que(int k,int d)
{
    int m=(cl[k]+cr[k])>>1;
    if(cl[k]==cr[k])
        return cl[k];
    /*    
        错误,因为开端不一定在最左边!
        if(max_near[k]==d)
        return cl[k];
    */
    pushdown(k,k<<1,k<<1|1);
    if(max_near[k<<1]>=d)
        return    que(k<<1,d);
     if(max_r[k<<1]+max_l[k<<1|1]>=d)  
        return m-max_r[k<<1]+1;
    else
        return que(k<<1|1,d);
}

void updata(int l,int r,int root,int z)
{
    if(l<=cl[root]&&cr[root]<=r)
    {
        lazy[root]=z;
        if(z)
            max_near[root]=max_l[root]=max_r[root]=len[root]=0;
        else
            max_near[root]=max_l[root]=max_r[root]=len[root]=cr[root]-cl[root]+1;
        return;
    }
    int m=(cr[root]+cl[root])>>1;
    pushdown(root,root<<1,root<<1|1);
    if(m>=l)
        updata(l,r,root<<1,z);
    if(m<r)
        updata(l,r,root<<1|1,z);
    pp(root);
}
int qian(int x)
{
    if(cl[x<<1])
        qian(x<<1);
    if(cl[x<<1|1])
        qian(x<<1|1);
}
int main()
{
    scanf("%d%d",&n,&m);
    build(1,1,n);
    for(re i=1;i<=m;i++)
    {
        scanf("%d",&a);
        if(a==1)
        {
            scanf("%d",&d);
            if(max_near[1]<d)
            {
                printf("0\n");
                continue;
            }
            o=que(1,d);
            printf("%d\n",o);
            updata(o,o+d-1,1,1);
        }
        else
        {
            scanf("%d%d",&x,&d);
            updata(x,x+d-1,1,0);
        }
    }
    return 0;
}

Hotel 旅馆, 线段树查询,合并的更多相关文章

  1. 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并

    题目描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...

  2. Poj 3667——hotel——————【线段树区间合并】

    Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13124   Accepted: 5664 Descriptio ...

  3. poj3667 Hotel (线段树 区间合并)

    poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...

  4. poj 3667 Hotel (线段树的合并操作)

    Hotel The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...

  5. POJ 3667 Hotel(线段树+区间合并)

    http://poj.org/problem?id=3667 题意: 有N个房间,M次操作.有两种操作(1)"1a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示 ...

  6. BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆 [线段树]

    传送门 题意: 操作1:找长为$len$的空区间并填满,没有输出$0$ 操作2:将$[l,r]$之间的区间置空 我真是太弱了这种线段树还写了一个半小时,中间为了查错手动模拟了$30min$线段树操作, ...

  7. bzoj1593 [Usaco2008 Feb]Hotel 旅馆(线段树)

    1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 758  Solved: 419[Submit ...

  8. POJ 3667 Hotel (线段树区间合并)

    题目链接:http://poj.org/problem?id=3667 题目大意:一共有n个房间,初始时都是空的,现在有m个操作,操作有以下两种: 1.1 d :询问是否有连续d个空的房间,若有则输出 ...

  9. (简单) POJ 3667 Hotel,线段树+区间合并。

    Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and e ...

随机推荐

  1. vivo商城促销系统架构设计与实践-概览篇

    一.前言 随着商城业务渠道不断扩展,促销玩法不断增多,原商城v2.0架构已经无法满足不断增加的活动玩法,需要进行促销系统的独立建设,与商城解耦,提供纯粹的商城营销活动玩法支撑能力. 我们将分系列来介绍 ...

  2. 题解 P5327 [ZJOI2019]语言

    P5327 [ZJOI2019]语言 解题思路 暴力 首先讲一下我垃圾的 40pts 的暴力(其他 dalao 都是 60pts 起步): 当然评测机快的话(比如 LOJ 的),可以卡过 3,4 个点 ...

  3. POJ 3761:Bubble Sort——组合数学

    题目大意:众所周知冒泡排序算法多数情况下不能只扫描一遍就结束排序,而是要扫描好几遍.现在你的任务是求1~N的排列中,需要扫描K遍才能排好序的数列的个数模20100713.注意,不同于真正的冒泡排序算法 ...

  4. IDEA中Springboot启动热部署

    在IDEA中开发springboot项目时,每次修改代码后都需要手动重启项目比较麻烦,可以通过添加一定的配置使每次修改代码后项目进行自动重启 在IDEA中开发springboot项目时,每次修改代码后 ...

  5. 架构之:serverless架构

    目录 简介 什么是serverless serverless的例子 简单的三层服务 消息驱动 FaaS FaaS的缺点 FaaS的优点 总结 简介 不知道什么时候,出现了一个叫做Serverless架 ...

  6. Docker:DockerFile详解与实例

    基本结构 Dockerfile 由一行行命令语句组成,并且支持已 # 开头的注释行. 一般而言,Dockerfile 的内容分为四个部分: 基础镜像信息. 维护者信息. 镜像操作指令. 容器启动时执行 ...

  7. Linux:Linux操作防火墙命令

    首先查看Linux的防火墙是否关闭 firewall-cmd Linux上新用的防火墙软件,跟iptables差不多的工具. firewall-cmd --state # 显示防火墙状态 system ...

  8. Ha1cyon_CTF-公开赛(wp)

    一.babyasm 00007FF7A8AC5A50 push rbp 00007FF7A8AC5A52 push rdi 00007FF7A8AC5A53 sub rsp,238h 00007FF7 ...

  9. buu 刮开有奖

    一.查壳, 二.拖入ida,分析 直接搜字符串完全没头绪,在看了大佬的wp才找到了,关键函数. 明显那个String就是我们要求的flag,要开始分析程序. 字符串长度为8,同时这个函数对字符串进行了 ...

  10. 卧槽,原来不需要FQ就可以构建海外镜像

    一. 背景 使用docker或者k8s的过程中,我们可能遇到镜像无法下载的情况,例如:kubernetes的kube-apiserver镜像,这是因为其仓库在海外,我们的网络被墙,我发获取到该资源,使 ...