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 & ...
随机推荐
- 修改机器名、IP对arcgis server、portal的影响?
修改机器名.IP是否对ArcGIS Server .Portal等有影响? 请教赛姐:修改IP对ArcGIS Server .Portal 无影响,不过建议将ArcGIS Server .Portal ...
- 场景服务只创建了 Service Difinition 和feature layer
环境:物理机 pro1.4:虚拟机 (server + datastore + portal + adaptor) 10.4.1 发布场景服务,正常情况应portal中查看,应包含四部分内容:Serv ...
- vue - vue-cli脚手架安装和webpack-simple模板项目生成
ue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. GitHub地址是:https://github.com/vuejs/vue-cli 一.安 ...
- Java8 Collectors.toMap的坑
按照常规思维,往一个map里put一个已经存在的key,会把原有的key对应的value值覆盖,然而通过一次线上问题,发现Java8中的Collectors.toMap反其道而行之,它默认给抛异常,抛 ...
- mysql 数据类型 目录
mysql 数据类型 mysql 整数类型 数值类型 tinyint mysql int 整数类型 解释显示宽度 和 存储宽度 mysql float 浮点型 mysql 日期类型 mysql 字符串 ...
- ListView多种item注意以及自己出现的莫名其妙的错误
如果ListView不懂,请绕路 1.ListView添加多个item必须用到的两个方法 getViewTypeCount一共有多少种item,我这里写的两种 getItemViewType当前pos ...
- Kafka介绍及安装部署
本节内容: 消息中间件 消息中间件特点 消息中间件的传递模型 Kafka介绍 安装部署Kafka集群 安装Yahoo kafka manager kafka-manager添加kafka cluste ...
- 001-读书笔记-企业IT架构转型之道-阿里巴巴中台战略思想与架构实战-第一章 阿里巴巴集团中台战略引发的思考
1.1.阿里中台发展 组件中台可能问题:组织间业务协作.业务核心能力的沉淀.组织KPI考核等 1.2.企业信息中心发展的症结 1.烟囱式系统建设模式 独立构建独立维护 缺点:1.重复功能建设和维护带来 ...
- React Native开发之IDE(Atom+Nuclide)安装,运行,调试
版权声明:本文为博主原创文章,如需转载请注明出处 目录(?)[-] 前言 MacWindowsLinux 准备工作 安装Atom 安装Nuclide 新建一个工程 自动补全 类型标注 语法检查 跳 ...
- union 类型(即sum types)在golang语言中的实现
http://www.jerf.org/iri/post/2917 Sum Types in Go posted Jun 02, 2013 in Programming, Golang, Haskel ...