题意:
酒店有n个房间,两种操作:
1 a:询问是不是有连续长度为a的空房间,有的话住进最左边
2 a b:将[a,a+b-1]的房间清空
思路:
核心:维护每个区间的最大空余长度是多少。
需要3个变量:
ls[i]:左端点向右连续最多有多少空房子
rs[i]:右端点向左连续最多有多少空房子
Tree[i]:整个区间最多连续有多少空房子
Tree[i] = max(rs[i * 2]+ls[i * 2+1], max(Tree[i * 2], Tree[i * 2+1])),很好理解,要么是左半部分的最大长度,要么是右半部分的最大长度,要么是跨越左右。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson l, mid, root<<1
#define rson mid+1, r, root<<1|1
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long LL;
const int maxn = 50000+5;
int Tree[maxn<<2], ls[maxn<<2], rs[maxn<<2]; // 区间内最大连续空闲长度
int lazy[maxn<<2];
void push_down(int rt, int len){
if(lazy[rt] == -1) return;
lazy[rt<<1] = lazy[rt&l