题面:P2894 [USACO08FEB]酒店Hotel

题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间(mx)。询问时由于查询的是最左边的合法端点,所以要从左到中间到右边依次考虑情况。

代码:

 #include<cstdio>
#include<cstring>
#include<iostream>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int maxn=+,maxm=+;
int N,M,o,D,X,ans;
inline int rd(){
int x=;char c=getchar();
while(c<''||c>'')c=getchar();
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x;
}
struct Tree{
int l,r,lazy,h_,t_,mx;
}t[maxn<<];
inline void Pushup(int x){
int ls=x<<,rs=x<<|;
if(t[ls].r-t[ls].l+==t[ls].mx)t[x].h_=t[ls].mx+t[rs].h_;else t[x].h_=t[ls].h_;
if(t[rs].r-t[rs].l+==t[rs].mx)t[x].t_=t[rs].mx+t[ls].t_;else t[x].t_=t[rs].t_;
t[x].mx=max(t[ls].mx,t[rs].mx);
t[x].mx=max(t[x].mx,t[ls].t_+t[rs].h_);
return;
}
inline void Build(int x,int l,int r){
t[x].l=l;t[x].r=r;t[x].lazy=-;
if(l==r){
t[x].h_=t[x].t_=t[x].mx=;
return;
}
int mid=(l+r)>>;
Build(x<<,l,mid);Build(x<<|,mid+,r);
Pushup(x);
return;
}
inline void Pushdown(int x){
if(t[x].lazy>=){
int k=t[x].lazy,ls=x<<,rs=x<<|;t[x].lazy=-;
if(k==){
t[ls].h_=t[ls].t_=t[ls].mx=;
t[rs].h_=t[rs].t_=t[rs].mx=;
}
else{
t[ls].h_=t[ls].t_=t[ls].mx=t[ls].r-t[ls].l+;
t[rs].h_=t[rs].t_=t[rs].mx=t[rs].r-t[rs].l+;
}
t[ls].lazy=t[rs].lazy=k;
}
return;
}
inline int Solve(int x,int d){
int ls=x<<,rs=x<<|,l=t[x].l,r=t[x].r;
if(r-l+==t[x].mx&&t[x].mx==d)return l;
Pushdown(x);
if(t[ls].mx>=d)return Solve(ls,d);
if(t[ls].t_+t[rs].h_>=d)return (t[ls].r-t[ls].t_+);
if(t[rs].mx>=d)return Solve(rs,d);
return ;
}
inline void Update(int x,int ql,int qr,int o){
int l=t[x].l,r=t[x].r;
if(ql<=l&&r<=qr){
if(o==)t[x].h_=t[x].t_=t[x].mx=;
else t[x].h_=t[x].t_=t[x].mx=r-l+;
t[x].lazy=o;
return;
}
int mid=(l+r)>>,ls=x<<,rs=x<<|;
Pushdown(x);
if(ql<=mid)Update(ls,ql,qr,o);
if(qr>mid)Update(rs,ql,qr,o);
Pushup(x);
return;
}
inline void write(int x){
char a[];int len=;
for(;x;x/=)a[len++]=x%;
if(!len)putchar('');
else while(len)putchar(a[--len]+'');
putchar('\n');
}
int main(){
N=rd();M=rd();
Build(,,N);
while(M--){
o=rd();
if(o==){
D=rd();
ans=Solve(,D);
write(ans);
if(ans)Update(,ans,ans+D-,);//1表示有住人
}
else{
X=rd();D=rd();
Update(,X,X+D-,);
}
}
return ;
}

//我为了卡常加入了快速读入和快速输出,实际食用代码时完全可以无视。


By:AlenaNuna

线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel的更多相关文章

  1. luogu P2894 [USACO08FEB]酒店Hotel

    题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...

  2. 洛谷P2894 [USACO08FEB]酒店Hotel

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

  3. P2894 [USACO08FEB]酒店Hotel

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

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

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

  5. 线段树||BZOJ5194: [Usaco2018 Feb]Snow Boots||Luogu P4269 [USACO18FEB]Snow Boots G

    题面:P4269 [USACO18FEB]Snow Boots G 题解: 把所有砖和靴子排序,然后依次处理每一双靴子,把深度小于等于它的砖块都扔线段树里,问题就转化成了求线段树已有的砖块中最大的砖块 ...

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

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

  7. 洛谷P2894[USACO08FEB]酒店Hotel(线段树)

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

  8. 洛谷 P2894 [USACO08FEB]酒店Hotel

    题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...

  9. 区间连续长度的线段树——洛谷P2894 [USACO08FEB]酒店Hotel

    https://www.luogu.org/problem/P2894 #include<cstdio> #include<iostream> using namespace ...

随机推荐

  1. 【Java】关于MyBatis框架的总结

    最近在学习MyBatis框架,我在这里记录一下学习MyBatis过程中的心得体会. Mybatis是什么?使用它我们可以做什么? MyBatis是一个开源的数据持久层框架,它内部封装了通过JDBC访问 ...

  2. toml

    其目标是成为一个小规模的易于使用的语义化配置文件格式.TOML被设计为可以无二义性的转换为一个哈希表(Hash table). # 这是一个TOML文件 title = "TOML Exam ...

  3. netstat使用--10个常用的命令

    1.列出所有的端口   netstat -a  列出TCP协议的端口  netstat -at   UDP协议的端口  netstat -au 2.列出处于监听状态的socket  netstat - ...

  4. Hyper-V 怎样拷贝文件至虚拟硬盘并附加到虚拟机上

    对于大文件来说,通过远程桌面拷贝是件麻烦的事情,虽然简单,但速度受限太多,不推荐使用. 我工作中对于大文件的拷贝,通过创建一个新的虚拟硬盘(VHD),再把大文件拷贝至虚拟硬盘中,最后附加到虚拟机上. ...

  5. PHP 扩展开发之Zephir

    最近对代码进行性能分析后,发现两个耗时的地方:自动加载文件数太多:参数验证函数调用超过1000次.这也是许多php语言框架面临的问题,所以发展出来诸如Yaf,Swoole,Phalcon这些C语言扩展 ...

  6. Atiitt 使用java语言编写sql函数或存储过程

    Atiitt 使用java语言编写sql函数或存储过程 1.1. java编写sql函数或存储过程的机制1 1.2. Java编写sp的优点1 1.3. 支持java源码,class文件,blog f ...

  7. (转)解决类似 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 的问题

    转自:https://itbilu.com/linux/management/NymXRUieg.html 源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/l ...

  8. Git 推送操作

    Jerry 修改了他的最后一次提交的修改操作,他已经准备好将更改.推操作的数据永久存储的 Git 仓库.推操作成功后,其他开发人员可以看到Jerry 的变化. 他执行的git日志命令来查看提交的细节. ...

  9. vs问题集

    ******将获取的所有的','换成'<br/>'********** data.Data.StandardSeating.replace(/,/g,"<br/>&q ...

  10. WPF 4.5 is here : check out the new features !

    So what's New in WPF Version 4.5 Developer Preview ? Here is a list of the new features and their re ...