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 & ...
随机推荐
- browserslist 目标浏览器配置表
为什么需要: 根据提供的目标浏览器的环境来,智能添加css前缀,js的polyfill垫片,来兼容旧版本浏览器,而不是一股脑的添加.避免不必要的兼容代码,以提高代码的编译质量. 共享使用browser ...
- String.replace使用技巧
relace replace() 方法返回一个由替换值替换一些或所有匹配的模式后的新字符串.模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数. 使用字符串 ...
- Nodejs学习笔记之复制文件
前端童鞋都知道,javascript是没有权限操作磁盘文件的,server童鞋一向都很鄙视.但是nodejs可谓让咱们前端扬眉吐气啊,最近在学node,其强大的功能让人异常激动和兴奋.今天就学习了它怎 ...
- linux 下解决git clone报错
解决报错:error: The requested URL returned error: 401 Unauthorized while accessing 问题报错:error: The req ...
- JavaScript 访问对象属性和方法及区别
这篇文章主要介绍了浅析JavaScript访问对象属性和方法及区别的相关资料,仅供参考 属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸. ...
- MySQL--主从数据库同步原理
主从数据库的复制原理:摘自MySQL官网 1. 异步 * 主在执行sql之后,记录二进制bin-log文件. * 同时从连接主服务器,并从主获取binlog,存于本地relay-log,并从上次记 ...
- easyui汉化啊!
<script type="text/javascript" src="__PUBLIC__/jquery-easyui-1.4.4/locale/easyui-l ...
- RocketMQ读书笔记5——消息队列的核心机制
[Broker简述] Broker是RocketMQ的核心,大部分“重量级”的工作都是由Broker完成的,包括: 1.接受Producer发过来的消息: 2.处理Consumer的消费信息请求: 3 ...
- 使用Axure管理团队项目以及分享原型
第一部分:使用Axure管理团队项目 首先,你要有一个Axure账户 呵呵哒.注册地址:http://share.axure.com 发起团队项目 在浏览器登录 Axure share(网速很卡很卡) ...
- UIButton中的**EdgeInsets是做什么用的?
UIButton中的**EdgeInsets是做什么用的? UIEdgeInsetsMake Creates an edge inset for a button or view.An inset i ...