题目大意

多次操作

查询并修改区间内长度==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. 2018/03/30 每日一个Linux命令 之 创建用户/密码

    感悟: 感觉每天学习下指令真的很不错,虽然感觉也没啥东西,但是真的用到了,马上就能想起来个大概,忘了详细的用法,就回来看看自己的博客. 话说今天GitHub上有个人 star 了我的项目,很开心,嘎嘎 ...

  2. QEMU IO事件处理框架

    Qemu IO事件处理框架 qemu是基于事件驱动的,在基于KVM的qemu模型中,每一个VCPU对应一个qemu线程,且qemu主线程负责各种事件的监听,这里有一个小的IO监听框架,本节对此进行介绍 ...

  3. webpack笔记二——entry

    entry是输入目录文件,有三种形式 1.对象键值对形式 entry: { main: './src/script/main.js', b: './src/script/b.js' }, 注意的是输出 ...

  4. eclipse导出doc帮助文档字符编码设置

  5. git 生成patch 和打入patch

    转载:https://blog.csdn.net/liuhaomatou/article/details/54410361 平时我们在使用git 管理项目的时候,会遇到这样一种情况,那就是客户使用gi ...

  6. hiredis(Synchronous API)

    hiredis是一个小型的client端的c库.它只增加了最小对协议的支持,同时它用一个高级别的printf-alike API为了绑定各种redis命令.除了支持发送和接收命令,它还支持对流的解析. ...

  7. openstack 部署笔记--glance

    控制节点 创建用户及服务 $ . admin-openrc $ openstack user create --domain default --password-prompt glance $ op ...

  8. 筛选DataTable中的数据

    DataTable dt = bll.GetTable(); //查询数据 DataTable newdt = new DataTable(); //一个新的table来保存筛选的记录 newdt = ...

  9. 剑指offer3

    输入一个链表,从尾到头打印链表每个节点的值. 思路:首先借助一个栈,遍历链表中的每一个值,然后存储到栈中,利用栈的先进后出特点,然后添加到数组中返回. package demo3; import ja ...

  10. 20165207 Exp0 Kali安装

    Exp0 Kali安装 选哪个 在打开www.kali.org的网页之后,我进入其下载页面,可供下载的kali版本有很多 对于选择哪个版本,在实验楼我用过xfce桌面.下面还有直接下下来就可以在vm里 ...