P2894 [USACO08FEB]酒店Hotel
简单的线段树维护区间信息。
维护三个值,一个是从左端点能拓展的长度,一个是从右端点能脱产的的长度。另一个是整个区间内的最大连续零一长度。
记录这三个值的目的在于可以使小区间合并大区间。
这样话就可以愉快的跑出答案了。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using std::max;
using std::min;
const int maxn=50100;
struct node
{
int lmax;//从左端点开始拓展的最长长度
int rmax;//右端点开始
int Max;//区间内的最大长度
int tag;//懒标记
void fill(int a=0,int b=0,int c=0,int d=0)//默认参数
{
if(b&&!c&&!d) d=c=b;//用于减少代码量
tag=a;lmax=b;rmax=c;Max=d;
return ;
}
};
node T[maxn<<2];
void push_up(int l,int r,int mid,int R)
{
T[R].lmax=T[R<<1].lmax;//左右区间直接赋值
T[R].rmax=T[R<<1|1].rmax;
if(T[R<<1].lmax==mid-l+1) T[R].lmax+=T[R<<1|1].lmax;//如果左端点直接跨越了整个左区间
if(T[R<<1|1].rmax==r-mid) T[R].rmax+=T[R<<1].rmax;//同上
T[R].Max=max(max(T[R<<1].Max,T[R<<1|1].Max),T[R<<1].rmax+T[R<<1|1].lmax);//取最大,切记要加上后面这一大坨
return ;
}
void push_down(int l,int r,int mid,int R)
{
if(!T[R].tag) return ;
if(T[R].tag==1)
{
T[R<<1].fill(1);
T[R<<1|1].fill(1);//整段区间归零
}
else
{
T[R<<1].fill(2,mid-l+1);
T[R<<1|1].fill(2,r-mid);//整段区间重置
}
T[R].tag=0;
return;
}
void build(int l,int r,int R)
{
if(l==r)
{
T[R].fill(0,1);//赋初值
return ;
}
int mid=(l+r)>>1;
build(l,mid,R<<1);
build(mid+1,r,R<<1|1);
push_up(l,r,mid,R);//合并
}
void updata(int l,int r,int al,int ar,int R,int mode)
{
if(l>ar||r<al) return ;
int mid=(l+r)>>1;
if(l>=al&&r<=ar)
{
if(mode==1) T[R].fill(1);//根据操作方案,赋值
else T[R].fill(2,r-l+1);
return ;
}//更新
push_down(l,r,mid,R);//下放懒标记
updata(l,mid,al,ar,R<<1,mode);
updata(mid+1,r,al,ar,R<<1|1,mode);
push_up(l,r,mid,R);//合并
return ;
}
int check(int l,int r,int R,int m)
{
int mid=(l+r)>>1;
push_down(l,r,mid,R);
if(T[R].lmax>=m) return l;//左端点可以拓展出比m长的长度,直接返回
if(T[R<<1].Max>=m) return check(l,mid,R<<1,m);//左区间的最大值大于m,递归查找
if(T[R<<1].rmax+T[R<<1|1].lmax>=m) return mid-T[R<<1].rmax+1;//从中间向左右拓展是可以的,返回
if(T[R<<1|1].Max>=m) return check(mid+1,r,R<<1|1,m);//右区间查询
return 0;//无解
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
build(1,n,1);
int opt,x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&opt,&x);
if(opt==1)
{
int ans=check(1,n,1,x);
if(ans) updata(1,n,ans,ans+x-1,1,1);
printf("%d\n",ans);
}
else
{
scanf("%d",&y);
updata(1,n,x,min(n,x+y-1),1,2);
}
}
return 0;
}
P2894 [USACO08FEB]酒店Hotel的更多相关文章
- 洛谷P2894 [USACO08FEB]酒店Hotel
P2894 [USACO08FEB]酒店Hotel https://www.luogu.org/problem/show?pid=2894 题目描述 The cows are journeying n ...
- 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel
题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...
- 洛谷 P2894 [USACO08FEB]酒店Hotel 解题报告
P2894 [USACO08FEB]酒店Hotel 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultur ...
- 洛谷P2894 [USACO08FEB]酒店Hotel [线段树]
题目传送门 酒店 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and ...
- luogu P2894 [USACO08FEB]酒店Hotel
题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...
- 洛谷 P2894 [USACO08FEB]酒店Hotel
题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...
- 区间连续长度的线段树——洛谷P2894 [USACO08FEB]酒店Hotel
https://www.luogu.org/problem/P2894 #include<cstdio> #include<iostream> using namespace ...
- P2894 [USACO08FEB]酒店Hotel 线段树
题目大意 多次操作 查询并修改区间内长度==len的第一次出现位置 修改区间,变为空 思路 类似于求区间最大子段和(应该是这个吧,反正我没做过) 维护区间rt的 从l开始向右的最长长度 从r开始向左的 ...
- 洛谷P2894[USACO08FEB]酒店Hotel(线段树)
问题描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
随机推荐
- Redis整合spring总结
一:Redis简介: Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理. 简单来说,它是一个以(key,value)的形式存储数据的数据库. 官网:https://re ...
- 简单的CRUD(二)
一.重构简单的CRUD 1.JDBC工具类 1.因为在crud中都包含一些相同的代码所以可以提取出来,抽取代码重构为工具类. 2.将工具类设置为static静态类,方便调用,不需要new对象. pub ...
- linux系统下部署项目
一.修改防火墙设置,开放对应的端口 修改Linux系统防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,如果要开放哪个端口,在里面添加一条 -A RH-Firewall- ...
- 读ios开发有感——建立APP开发体系
前言:ios开发和现在的大前端.跨端开发在底层上的道理是相通的,因此通过学习ios开发,可以形成对APP开发体系的理解. 一.app开发的知识体系 基础 应用开发 原理 原生与前端 二.基础模块 按照 ...
- Python入门-类的成员
昨天我们简单的认识了一下面向对象,以及和面向过程之间的区别,从而我们知道了类这个东西,今天我们就来详细的了解一下关于类的一些东西. 一.类的成员 首先, 什么是类的成员,很简单, 你能在类中写什么? ...
- RN记录
react-native run-android 出现 java.lang.nullpointerexception(no error message) 错误 删除 工程目录\android.grad ...
- Python基础-简介二
一.变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些 ...
- IntelliJ IDEA快速创建属性字段的get和set方法
1.写好属性字段后,在代码面板右击,选择generator… 再选择 Getter and Setter 全选中(Ctrl + A),点击OK! 2.也可以选择使用快捷键:alt+inse ...
- 多线程 读写锁SRWLock
在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法——读写锁SRWLock来解决这一 ...
- ubuntu安装最新版node和npm
1.先在系统上安装好nodejs和npm sudo apt-get install nodejs-legacy sudo apt-get install npm 2.升级n ...