题目传送门


线段树维护区间

  • 线段树结构体
struct zzz{
    int l,r,mi;
    //l为以左端点的为起点的最长子串
    //r为以右端点为终点的最长子串
    //mi是区间内部的最长子串
}tree[50010<<2];
  • 合并
    合并的时候要考虑左右区间互拼的情况
inline void up(int l,int r,int p){
    if(tree[ls].l==mid-l+1)
      tree[p].l=tree[ls].l+tree[rs].l;
    else tree[p].l=tree[ls].l;
    if(tree[rs].r==r-mid)
      tree[p].r=tree[rs].r+tree[ls].r;
    else tree[p].r=tree[rs].r;
    tree[p].mi=max(max(tree[ls].mi,tree[rs].mi),tree[ls].r+tree[rs].l);
}
  • 询问
    因为要查找最左的房间,所以尽量向左找
int query(int l,int r,int p,int k){
    down(l,r,p);
    if(l==r) return l;
    if(tree[ls].mi>=k) return query(l,mid,ls,k);
    if(tree[ls].r+tree[rs].l>=k) return mid-tree[ls].r+1;
    return query(mid+1,r,rs,k);
}

最核心的就是这几个函数了,别的函数基本没有变化,直接看总代码就好

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define ls p<<1
#define rs p<<1|1
#define mid ((l+r)>>1)
using namespace std;
int read(){
    int k=0,f=1; char c=getchar();
    for(;c<'0'||c>'9';c=getchar())
      if(c=='-') f=-1;
    for(;c>='0'&&c<='9';c=getchar())
      k=k*10+c-48;
    return k*f;
}
struct zzz{
    int l,r,mi;
}tree[50010<<2]; int tag[50010<<2];
inline void up(int l,int r,int p){
    if(tree[ls].l==mid-l+1)
      tree[p].l=tree[ls].l+tree[rs].l;
    else tree[p].l=tree[ls].l;
    if(tree[rs].r==r-mid)
      tree[p].r=tree[rs].r+tree[ls].r;
    else tree[p].r=tree[rs].r;
    tree[p].mi=max(max(tree[ls].mi,tree[rs].mi),tree[ls].r+tree[rs].l);
}
void build(int l,int r,int p){
    if(l==r){
        tree[p].l=tree[p].r=tree[p].mi=1;
        return ;
    }
    build(l,mid,ls); build(mid+1,r,rs);
    up(l,r,p);
}
inline void down(int l,int r,int p){
    if(tag[p]==-1) return ;
    tree[ls].l=tree[ls].mi=tree[ls].r=(mid-l+1)*tag[p];
    tree[rs].l=tree[rs].mi=tree[rs].r=(r-mid)*tag[p];
    tag[ls]=tag[rs]=tag[p];
    tag[p]=-1;
}
int query(int l,int r,int p,int k){
    down(l,r,p);
    if(l==r) return l;
    if(tree[ls].mi>=k) return query(l,mid,ls,k);
    if(tree[ls].r+tree[rs].l>=k) return mid-tree[ls].r+1;
    return query(mid+1,r,rs,k);
}
void update(int l,int r,int p,int nl,int nr,int k){
    if(l>=nl&&r<=nr){
        tree[p].l=tree[p].r=tree[p].mi=k*(r-l+1);
        tag[p]=k; return ;
    }
    down(l,r,p);
    if(nl<=mid) update(l,mid,ls,nl,nr,k);
    if(nr>mid) update(mid+1,r,rs,nl,nr,k);
    up(l,r,p);
}
int main(){
    int n=read(),m=read();
    memset(tag,-1,sizeof(tag));
    build(1,n,1);
    for(int i=1;i<=m;i++){
        int k=read();
        if(k==1){
            int x=read();
            if(tree[1].mi<x){
                printf("0\n"); continue;
            }
            int pos=query(1,n,1,x);
            printf("%d\n",pos);
            update(1,n,1,pos,pos+x-1,0);
        }
        else{
            int x=read(),y=read();
            update(1,n,1,x,x+y-1,1);
        }
    }
    return 0;
}

USACO08FEB Hotel的更多相关文章

  1. [USACO08FEB]Hotel 题解

    正确的题解 首先我们都知道这题要用线段树做.考虑维护靠左边的answer,靠右边的answer,和整个区间的answer,那么就珂以维护这道题目了. 这里比较复杂的有下传操作和上传操作. 上传 voi ...

  2. 洛谷P2894 [USACO08FEB]酒店Hotel

    P2894 [USACO08FEB]酒店Hotel https://www.luogu.org/problem/show?pid=2894 题目描述 The cows are journeying n ...

  3. 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel

    题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...

  4. P2894 [USACO08FEB]酒店Hotel

    P2894 [USACO08FEB]酒店Hotel 简单的线段树维护区间信息. 维护三个值,一个是从左端点能拓展的长度,一个是从右端点能脱产的的长度.另一个是整个区间内的最大连续零一长度. 记录这三个 ...

  5. 洛谷 P2894 [USACO08FEB]酒店Hotel 解题报告

    P2894 [USACO08FEB]酒店Hotel 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultur ...

  6. 线段树【洛谷P2894】 [USACO08FEB]酒店Hotel

    P2894 [USACO08FEB]酒店Hotel 参考样例,第一行输入n,m ,n代表有n个房间,编号为1---n,开始都为空房,m表示以下有m行操作,以下 每行先输入一个数 i ,表示一种操作: ...

  7. 浅谈线段树 (例题:[USACO08FEB]酒店Hotel)By cellur925

    今天我们说说线段树. 我个人还是非常欣赏这种数据结构的.(逃)因为它足够优美,有递归结构,有左子树和右子树,还有二分的思想. emm这个文章打算自用,就不写那些基本的操作了... 1° 简单的懒标记( ...

  8. [USACO08FEB]酒店Hotel 线段树

    [USACO08FEB]酒店Hotel 线段树 题面 其实就是区间多维护一个lmax,rmax(表示从左开始有连续lmax个空房,一直有连续rmax个空房到最右边),合并时讨论一下即可. void p ...

  9. 洛谷P2894 [USACO08FEB]酒店Hotel [线段树]

    题目传送门 酒店 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and ...

随机推荐

  1. IT兄弟连 JavaWeb教程 jQuery对AJAX的支持

    jQuery对AJAX的支持 jQuery对Ajax请求的创建.发送.响应.注册数据处理函数.JSON的解析和缓存以及传参等都进行了相应的封装,同时也考虑了浏览器的兼容性问题. jQuery中对AJA ...

  2. 如何备份Chrome浏览器收藏夹

    前言:最近,由于工作需要,要卸载当前Chrome版本,并安装最新版Chrome.卸载前,意识到之前收藏在收藏夹里的很多知识链接还未备份,于是有了今天的话题:如何备份Chrome浏览器的收藏夹? 主题: ...

  3. SpringMVC 控制器写多个方法(非注解方式)

    Controller类有两种方法 1,implements Controller(实现Controller接口) 2,extends MultiActionController(继承 MultiAct ...

  4. Mysql相关函数使用和总结(liet、right、substring、substring_index)

    一.字段截取 1.从左开始截取字符串 用法:left(str,length),即:leift(被截取字符串,截取长度) 列子:select left(‘www.baidu.com’,8) 结果:www ...

  5. eclipse svn 忽略target .project .classpath等目录文件

    这个build失败的解决方案就是不要把你项目的 target目录放在src repository 里面,还有 .project 和 .classpath 最好也别放到src repository 里. ...

  6. nutzboot 使用nacos替换zookeeper

    先放一段从网上拷贝一段分布式CAP理论的概念 分布式领域中存在CAP理论,且该理论已被证明:任何分布式系统只可同时满足两点,无法三者兼顾. ①C:Consistency,一致性,数据一致更新,所有数据 ...

  7. bzoj3295: [Cqoi2011]动态逆序对 三维数点

    为了便于考虑,把删除反序变为增加 于是就变成关于权值和位置和时间的三维数点 一波cdq一波树状数组教做人 (神TM需要longlong,80了一发) #include <bits/stdc++. ...

  8. NET Core 2.1 Global Tools

    微软工程师Nate McMaster的博文.NET Core 2.1 Global Tools https://natemcmaster.com/blog/2018/05/12/dotnet-glob ...

  9. yum指令之修复

    折腾着搞 openvpn 网站服务器 yum指令 出了点问题 ------------------------------------------------------------ [root@cl ...

  10. Aspose.word直接转pdf

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...