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 & ...
随机推荐
- 从服务器下载文件 DownloadServlet()
.html代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- UrlRewrite 的配置和使用总结
UrlRewrite就是我们通常说的地址重写,用户得到的全部都是经过处理后的URL地址. 主要优点 一:提高安全性,可以有效的避免一些参数名.ID等完全暴露在用户面前,如果用户随便乱输的话,不 ...
- ubuntu 16.10安装nginx
1 : cd /usr/local 2 : sudo wget http://nginx.org/download/nginx-1.2.8.tar.gz 3 : sudo tar -zxvf ngin ...
- spring cglib 与 jdk 动态代理
1. 概述 JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理 Cglib动态代理是 利用asm开源包 把被代理类的clas ...
- Makefile一 头文件及库搜索路径
头文件及库搜索路径 头文件的搜索路径: 头文件的搜索规则是:找到就使用,停止继续往下寻找 1: #include “mytest.h” 搜索的顺序为: (1)先搜索当前目录 (2)然后搜索编译时 -I ...
- go的编译与重启
ps -ef|grep pro-name| grep -v grep|awk '{print $2}'|xargs kill -9 > /dev/null go build nohup ./xe ...
- Django—自定义分页
分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置. 确定分页需求: 1. 每页显示的数据条数 2. 每页显示页号链接数 3. 上一页 ...
- USG防火墙基础
http://support.huawei.com/huaweiconnect/enterprise/thread-331003.html 华为防火墙产品线 安全区域 1. 默认防火墙区域 T ...
- 003客户端负载均衡Ribbon & 短路器Hystrix
1.POM配置 和普通Spring Boot工程相比,仅仅添加了Eureka.Ribbon.Hystrix依赖和Spring Cloud依赖管理 <dependencies> <!- ...
- 如何在一台机器上运行2个Tomcat
比如:有两个版本的tomcat,一个5.*,一个6.*,此时由于两个工程分别部署在两个 版本的tomcat下,需要同时启动两个tomcat,以下是方法: 1.特别要注意:不要设置CATALINA_HO ...