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 & ...
随机推荐
- 2018/03/16 echo、print_r、print、var_dump之间的区别
还是先说下我对这个方法的理解 print_r()用于 cli模式下的输出调试,error_log() 调试 var_dump() 用于页面的显示调试 echo() 用处比较多,__toString() ...
- mysql全局唯一ID生成方案(二)
MySQL数据表结构中,一般情况下,都会定义一个具有‘AUTO_INCREMENT’扩展属性的‘ID’字段,以确保数据表的每一条记录都可以用这个ID唯一确定: 随着数据的不断扩张,为了提高数据库查询性 ...
- Catch That Cow--POJ3278
Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...
- extjs错误,看到红色才能让自己记住知识点
1.Cannot call method 'getColumnCount' of undefined Hi, maybe you use colModel before rendering.Notic ...
- [py]django前台处理后端返回的各类数据
参考 要完成的任务 返回str 返回list 返回arr 前端遍历 关键字 if for语句处理str list dict - 遍历字典 for语句 {% for key, value in info ...
- PAT 1064 Complete Binary Search Tree[二叉树][难]
1064 Complete Binary Search Tree (30)(30 分) A Binary Search Tree (BST) is recursively defined as a b ...
- 你应该知道的最好Webmail邮件客户端,
1 . Kite Kite is an opensource replacement to Gmail. Kite is a webmail designed to look a lot like g ...
- linux中vim的常用方法
i 当前光标位置插入 a 当前光标后插入 0 另起一行插入 A 在光标所在行尾插入 I 在光标所在行首插入 :set nu设置 行号 :set nunu 取消行号 gg 到第一行 G 到最后一行 $ ...
- Ignite内存数据库与sql支持
Ignite采用h2作为内存数据库,支持h2的一切sql语法.如果是本地缓存或者复制缓存,sql执行直接在本地h2数据库中执行,如果是分区缓存,ignite则会分解sql到多个h2数据库执行后再汇总. ...
- Spring 问题总结
Spring问答Top 25:http://www.importnew.com/15851.html [Java面试五]Spring总结以及在面试中的一些问题.:http://www.cnblogs. ...