P2894 [USACO08FEB]酒店Hotel 线段树
题目大意
多次操作
查询并修改区间内长度==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 线段树的更多相关文章
- 洛谷P2894 [USACO08FEB]酒店Hotel [线段树]
题目传送门 酒店 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and ...
- [USACO08FEB]酒店Hotel 线段树
[USACO08FEB]酒店Hotel 线段树 题面 其实就是区间多维护一个lmax,rmax(表示从左开始有连续lmax个空房,一直有连续rmax个空房到最右边),合并时讨论一下即可. void p ...
- [USACO08FEB]酒店Hotel 线段树 BZOJ 1593
题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...
- 线段树||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
P2894 [USACO08FEB]酒店Hotel 简单的线段树维护区间信息. 维护三个值,一个是从左端点能拓展的长度,一个是从右端点能脱产的的长度.另一个是整个区间内的最大连续零一长度. 记录这三个 ...
- 洛谷 P2894 [USACO08FEB]酒店Hotel 解题报告
P2894 [USACO08FEB]酒店Hotel 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultur ...
- 洛谷P2894 [USACO08FEB]酒店Hotel
P2894 [USACO08FEB]酒店Hotel https://www.luogu.org/problem/show?pid=2894 题目描述 The cows are journeying n ...
- 洛谷P2894[USACO08FEB]酒店Hotel(线段树)
问题描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
随机推荐
- mysql数据库的相关练习题及答案
表结构示意图: 表结构创建语句: class表创建语句 create table ) not null)engine=innodb default charset=utf8; student表创建语句 ...
- contenttypes - django组件
一.contenttypes介绍 它的作用:可以通过两个字段让表和N张表创建FK关系 二.ContentType.GenericForeignKey.GenericRelation 表结构: from ...
- cas sso原理
以下转载至https://blog.csdn.net/javaloveiphone/article/details/52439613 从结构上看,CAS包含两个部分:CAS Server 和CAS C ...
- Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)
事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...
- BZOJ5056 OI游戏 最短路+组合数学
链接接接接接! 正解:最短路+小学奥数 乘法原理 解题报告: 首先读懂题意(,,,我觉得我吃枣死于语文太差读不懂题目QAQ 大意就是港,要求从第一个点到其他各点的长度都是最短的方案有多少个(ummm, ...
- 可以搜索到DedeCms后台文章列表文档id吗?或者快速定位id编辑文章
我们在建站时有的时候发现之前的文章有错误了,要进行修改,但又不知道文章名,只知道大概的文章id,那么可以搜索到DedeCms后台文章列表文档id吗?或者快速定位文章id方便修改? 第一种方法:复制下面 ...
- for和foreach的区别
public class Program { public static void Main() { Program program = new Program(); program.For();// ...
- oracle实例内存(SGA和PGA)调整
修改oracle内存占用 >show parameter sga; (查看内存占用情况) NAME TYPE ...
- SQL Expression Language Tutorial 学习笔记二
11. Using Textual SQL 直接使用 SQL 如果实在玩不转, 还是可以通过 test() 直接写 SQL. In [51]: s = text( ...: "SELECT ...
- mysql的转储SQL文件
1.转储数据库的SQL文件,有两个选择,一是转储结构:另一种是转储数据与结构: 2.以上两种转储都不会将事件(定时器)转储,所以特别注意这个,否则以为将数据库备份完了,其实漏掉了所有的事件代码,所以需 ...