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的更多相关文章

  1. 洛谷P2894 [USACO08FEB]酒店Hotel

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

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

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

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

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

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

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

  5. luogu P2894 [USACO08FEB]酒店Hotel

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

  6. 洛谷 P2894 [USACO08FEB]酒店Hotel

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

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

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

  8. P2894 [USACO08FEB]酒店Hotel 线段树

    题目大意 多次操作 查询并修改区间内长度==len的第一次出现位置 修改区间,变为空 思路 类似于求区间最大子段和(应该是这个吧,反正我没做过) 维护区间rt的 从l开始向右的最长长度 从r开始向左的 ...

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

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

随机推荐

  1. Emmet使用方法

    本文摘自:http://www.iteye.com/news/27580 Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语 ...

  2. split 将字符串分割成字符串数组

    list_name = list_name.split(","); split() 方法用于把一个字符串分割成字符串数组. 语法 stringObject.split(separa ...

  3. poj Corn Fields 状态压缩dp。

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5763   Accepted: 3052 Descr ...

  4. c语言结构体可以直接赋值

    结构体直接赋值的实现 下面是一个实例: #include <stdio.h> struct Foo { char a; int b; double c; }foo1, foo2; //de ...

  5. 第10章 布局样式相关-伸缩布局(Flexible Box)

    伸缩布局(一) CSS3引入了一种新的布局模式--Flexbox布局,即伸缩布局盒模型(Flexible Box),用来提供一个更加有效的方式制定.调整和分布一个容器里项目布局,即使它们的大小是未知或 ...

  6. HDU4652:Dice

    题面 传送门 题意 \(m\)面的骰子 求连续出现\(n\)个相同面的期望次数 或者 求连续出现\(n\)个不同面的期望次数 Sol 设\(f[i]\)表示已经出现了\(i\)~\(n\)这些面相同的 ...

  7. package.json中版本理解

    一个完整的版本号可以理解为: [主要版本号,次要版本号,补丁版本号]版本号 x.y.z :其中z 表示一些小的bugfix, y表示一些大的版本更改,比如一些API的变化x表示一些设计的变动及模块的重 ...

  8. html标签篇(2)

    上次讲到<a>标签,并没有细说a标签用法. <!DOCTYPE html> <html lang="en"> <head>  < ...

  9. Linux基础之-网络配置,主机名设置,ssh登陆,scp传输

    一. 网络配置修改 1.临时修改(ip,dns,netmask,gateway) 临时修改网络配置,只要没有涉及到修改配置文件的,在network服务重启后,所有设置失效 2.永久修改(ip,dns, ...

  10. css伪元素详解

    css的伪元素,之所以被称为伪元素,是因为他们不是真正的页面元素,html没有对应的元素,但是其所有用法和表现行为与真正的页面元素一样,可以对其使用诸如页面元素一样的css样式,表面上看上去貌似是页面 ...