题目大意

多次操作

查询并修改区间内长度==len的第一次出现位置

修改区间,变为空

思路

类似于求区间最大子段和(应该是这个吧,反正我没做过) 维护区间rt的

从l开始向右的最长长度

从r开始向左的最长长度

l到r内的最长长度

反正维护的是个01序列, 随便做

又是小错误,第一遍就能过非得debug一小时

这里懒惰标记有两个,开bool为了省 省不了多少的 内存gg了(可以过样例也是神奇,也许是windows吧)

还有样例好坑啊,我以为是\([5,10]\)(其实是我没认真看)

代码

#include <iostream>
#include <cstdio>
#define ls rt << 1
#define rs rt << 1 | 1
using namespace std;
const int maxn=5e4+7;
const int maxm=2e5+7; int n, m;
struct node {
int l, r, size,lk, rk, k,lazy;
void delet() {
lk=rk=k=0;
lazy=1;
}
void add() {
lk=rk=k=size;
lazy=2;
}
}e[maxm]; int max_2(int a, int b, int c) {
return max(max(a, b), c);
} int read() {
int x = 0, f = 1; char s = getchar();
for (; s > '9' || s < '0'; s = getchar()) if (s == '-') f = -1;
for (; s <= '9' && s >= '0'; s = getchar()) x = x * 10 + s - '0';
return x * f;
} void pushup(int rt) {
e[rt].k = max_2(e[ls].k, e[rs].k, e[ls].rk + e[rs].lk);
e[rt].lk = (e[ls].lk == e[ls].size) ? e[ls].lk + e[rs].lk : e[ls].lk;
e[rt].rk = (e[rs].rk == e[rs].size) ? e[ls].rk + e[rs].rk : e[rs].rk;
} void pushdown(int rt) {
if (e[rt].lazy==1) {
e[ls].delet();
e[rs].delet();
e[rt].lazy = 0;
} else
if(e[rt].lazy==2) {
e[ls].add();
e[rs].add();
e[rt].lazy = 0;
}
} void build(int l, int r, int rt) {
e[rt].l = l, e[rt].r = r, e[rt].size = r - l + 1;
if (l == r) {
e[rt].lk = e[rt].rk = e[rt].k = 1;
return;
}
int mid = (l + r) >> 1;
build(l, mid, ls);
build(mid + 1, r, rs);
pushup(rt);
} void update(int L, int R,int k ,int rt) {
if (L <= e[rt].l && e[rt].r <= R) {
k==1 ? e[rt].delet() :e[rt].add();
return;
}
pushdown(rt);
int mid = (e[rt].l + e[rt].r) >> 1;
if(L <= mid) update(L,R,k,ls);
if(R > mid) update(L,R,k,rs);
pushup(rt);
} int query(int L, int R, int k, int rt) {
pushdown(rt);
int ans=0;
if(e[ls].k >=k ) ans=query(L,R,k,ls);
else if(e[ls].rk+e[rs].lk >= k) ans = e[ls].r - e[ls].rk + 1;
else if(e[rs].k >= k)ans = query(L,R,k,rs);
pushup(rt);
return ans;
}
void yangli_debug()
{
printf("debug\n");
printf(" %d\n", e[1].k);
printf(" %d %d\n",e[2].k,e[3].k );
printf(" %d %d %d %d\n",e[4].k,e[5].k,e[6].k,e[7].k );
printf(" %d %d %d %d %d %d %d %d\n", e[8].k,e[9].k,e[10].k,e[11].k,e[12].k,e[13].k,e[14].k,e[15].k);
for(int i=16;i<=31;++i)
cout<<e[i].k<<" ";
puts("");
}
int main() {
n = read(), m = read();
build(1, n, 1); for (; m--;) {
int tmp = read();
if (tmp == 1) {
int a = read();
if (e[1].k >= a) {
int ans = query(1, n, a, 1);
printf("%d\n", ans);
update(ans, ans + a-1, 1, 1);
} else {
puts("0");
}
} else {
int a = read(), b = read();
update(a, a+b-1, 2,1);
}
}
return 0;
}

P2894 [USACO08FEB]酒店Hotel 线段树的更多相关文章

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

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

  2. [USACO08FEB]酒店Hotel 线段树

    [USACO08FEB]酒店Hotel 线段树 题面 其实就是区间多维护一个lmax,rmax(表示从左开始有连续lmax个空房,一直有连续rmax个空房到最右边),合并时讨论一下即可. void p ...

  3. [USACO08FEB]酒店Hotel 线段树 BZOJ 1593

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

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

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

  5. 洛谷 P2894 [USACO08FEB]酒店Hotel-线段树区间合并(判断找位置,不需要维护端点)+分治

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

  6. P2894 [USACO08FEB]酒店Hotel

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

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

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

  8. 洛谷P2894 [USACO08FEB]酒店Hotel

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

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

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

随机推荐

  1. pycharm中python模板代码自动生成

    # -*- coding: utf-8 -*- """ ------------------------------------------------- File Na ...

  2. MySQL多线程备份工具:mydumper

    MySQL多线程备份工具:mydumper http://www.orczhou.com/index.php/2011/12/how-to-split-mysqldump-file/ Mydumper ...

  3. 010-jdk1.8版本新特性二-Optional类,Stream流

    1.5.Optional类 1.定义 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个 ...

  4. SQLAlchemy通过models创建数据库表

    原地址:http://blog.csdn.net/jmilk/article/details/53184903 定义数据模型 models SQLAlchemy 允许我们根据数据库的表结构来创建数据模 ...

  5. PAT 1023 Have Fun with Numbers[大数乘法][一般]

    1023 Have Fun with Numbers (20)(20 分) Notice that the number 123456789 is a 9-digit number consistin ...

  6. 两个list对应元素相加

    a=[1,2,3] b=[4,5,6] 现将list a与 list b按位相加,其结果为[5,7,9] 方法一: c=[a[i]+b[i] for i in range(min(len(a),len ...

  7. 从游戏开发到web前端——仅仅只是开始

    文章开头,请允许我随便扯扯. 一来,开头从来都是最难写的,二来,描述我现在的心情和状态以及工作背景啥的,对于大家理解后面的内容也许会有所帮助~ 2012年211大学毕业,工作4年了,一直都是做游戏前端 ...

  8. liferay中如何实现自己定义的方法

    大家看到这篇文章是不是很开心啊,我感觉是很开心,我们终于可以按照自己的意愿来写一次代码,在liferay中一些基本的增删改查的代码是自动生成的,然而我们想要实现自己的方法的话,恐怕要费一点劲,你要知道 ...

  9. excel 批量在一列数据添加单引号以及逗号

    在A列后插入一列B1输入="'"&a1&"'," 然后向下填充 就ok 了 向下填充:选中上方连续单元格,鼠标放在选中区域右下角处(会显示“十” ...

  10. VisualStudio: 窗口背景颜色设置成黑色

    Tools>Options>Environment>General >Color theme