USACO08FEB Hotel
线段树维护区间
- 线段树结构体
struct zzz{
int l,r,mi;
//l为以左端点的为起点的最长子串
//r为以右端点为终点的最长子串
//mi是区间内部的最长子串
}tree[50010<<2];
- 合并
合并的时候要考虑左右区间互拼的情况
inline void up(int l,int r,int p){
if(tree[ls].l==mid-l+1)
tree[p].l=tree[ls].l+tree[rs].l;
else tree[p].l=tree[ls].l;
if(tree[rs].r==r-mid)
tree[p].r=tree[rs].r+tree[ls].r;
else tree[p].r=tree[rs].r;
tree[p].mi=max(max(tree[ls].mi,tree[rs].mi),tree[ls].r+tree[rs].l);
}
- 询问
因为要查找最左的房间,所以尽量向左找
int query(int l,int r,int p,int k){
down(l,r,p);
if(l==r) return l;
if(tree[ls].mi>=k) return query(l,mid,ls,k);
if(tree[ls].r+tree[rs].l>=k) return mid-tree[ls].r+1;
return query(mid+1,r,rs,k);
}
最核心的就是这几个函数了,别的函数基本没有变化,直接看总代码就好
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define ls p<<1
#define rs p<<1|1
#define mid ((l+r)>>1)
using namespace std;
int read(){
int k=0,f=1; char c=getchar();
for(;c<'0'||c>'9';c=getchar())
if(c=='-') f=-1;
for(;c>='0'&&c<='9';c=getchar())
k=k*10+c-48;
return k*f;
}
struct zzz{
int l,r,mi;
}tree[50010<<2]; int tag[50010<<2];
inline void up(int l,int r,int p){
if(tree[ls].l==mid-l+1)
tree[p].l=tree[ls].l+tree[rs].l;
else tree[p].l=tree[ls].l;
if(tree[rs].r==r-mid)
tree[p].r=tree[rs].r+tree[ls].r;
else tree[p].r=tree[rs].r;
tree[p].mi=max(max(tree[ls].mi,tree[rs].mi),tree[ls].r+tree[rs].l);
}
void build(int l,int r,int p){
if(l==r){
tree[p].l=tree[p].r=tree[p].mi=1;
return ;
}
build(l,mid,ls); build(mid+1,r,rs);
up(l,r,p);
}
inline void down(int l,int r,int p){
if(tag[p]==-1) return ;
tree[ls].l=tree[ls].mi=tree[ls].r=(mid-l+1)*tag[p];
tree[rs].l=tree[rs].mi=tree[rs].r=(r-mid)*tag[p];
tag[ls]=tag[rs]=tag[p];
tag[p]=-1;
}
int query(int l,int r,int p,int k){
down(l,r,p);
if(l==r) return l;
if(tree[ls].mi>=k) return query(l,mid,ls,k);
if(tree[ls].r+tree[rs].l>=k) return mid-tree[ls].r+1;
return query(mid+1,r,rs,k);
}
void update(int l,int r,int p,int nl,int nr,int k){
if(l>=nl&&r<=nr){
tree[p].l=tree[p].r=tree[p].mi=k*(r-l+1);
tag[p]=k; return ;
}
down(l,r,p);
if(nl<=mid) update(l,mid,ls,nl,nr,k);
if(nr>mid) update(mid+1,r,rs,nl,nr,k);
up(l,r,p);
}
int main(){
int n=read(),m=read();
memset(tag,-1,sizeof(tag));
build(1,n,1);
for(int i=1;i<=m;i++){
int k=read();
if(k==1){
int x=read();
if(tree[1].mi<x){
printf("0\n"); continue;
}
int pos=query(1,n,1,x);
printf("%d\n",pos);
update(1,n,1,pos,pos+x-1,0);
}
else{
int x=read(),y=read();
update(1,n,1,x,x+y-1,1);
}
}
return 0;
}
USACO08FEB Hotel的更多相关文章
- [USACO08FEB]Hotel 题解
正确的题解 首先我们都知道这题要用线段树做.考虑维护靠左边的answer,靠右边的answer,和整个区间的answer,那么就珂以维护这道题目了. 这里比较复杂的有下传操作和上传操作. 上传 voi ...
- 洛谷P2894 [USACO08FEB]酒店Hotel
P2894 [USACO08FEB]酒店Hotel https://www.luogu.org/problem/show?pid=2894 题目描述 The cows are journeying n ...
- 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel
题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...
- 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 参考样例,第一行输入n,m ,n代表有n个房间,编号为1---n,开始都为空房,m表示以下有m行操作,以下 每行先输入一个数 i ,表示一种操作: ...
- 浅谈线段树 (例题:[USACO08FEB]酒店Hotel)By cellur925
今天我们说说线段树. 我个人还是非常欣赏这种数据结构的.(逃)因为它足够优美,有递归结构,有左子树和右子树,还有二分的思想. emm这个文章打算自用,就不写那些基本的操作了... 1° 简单的懒标记( ...
- [USACO08FEB]酒店Hotel 线段树
[USACO08FEB]酒店Hotel 线段树 题面 其实就是区间多维护一个lmax,rmax(表示从左开始有连续lmax个空房,一直有连续rmax个空房到最右边),合并时讨论一下即可. void p ...
- 洛谷P2894 [USACO08FEB]酒店Hotel [线段树]
题目传送门 酒店 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and ...
随机推荐
- git (Linux安装及使用教程)
查看当前服务器是否有安装git git --version 如果有,那么查看版本号,是否是你想要的或最新的版本 如果不是自己想要的版本,那么执行以下命令可卸载当前版本 yum remove git 卸 ...
- AGC001 C - Shorten Diameter【枚举】
一开始没看到要保证最后是树--所以一定要从叶子开始删 枚举重心,如果k是偶数,那么按当前重心提起来deep大于k/2的全都要切掉,这样枚举重心然后取min即可 奇数的话就是枚举直径中间的边,然后从两边 ...
- 洛谷 P1070 道路游戏(noip 2009 普及组 第四题)
题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 nn个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 nn个机器人工厂编 ...
- 洛谷 P1434 [SHOI2002]滑雪 解题报告
这题方法有很多, 这里介绍2种: 方法1 很容易想到搜索, bfs或dfs应该都可以, 就不放代码了: 方法2 这题还可以用 dp 来做. 做法:先将每个点按照高度从小到大排序,因为大的点只能向小的点 ...
- day7计算作业详解
1.day7题目 1.判断一个数是否是水仙花数, 水仙花数是一个三位数, 三位数的每一位的三次方的和还等于这个数. 那这个数就是一个水仙花数, 例如: 153 = 13 + 53 + 3**3 2.给 ...
- NET Core开发
NET Core开发 Visual Studio 2017 ASP.NET Core开发,Visual Studio 2017 已经内置ASP.NET Core 开发工具. 在选择.NET Core ...
- zabbix agent 配置
http://blog.csdn.net/z644041867/article/details/76618644 https://www.cnblogs.com/miclesvic/p/6144924 ...
- 046 Permutations 全排列
给定一个含有不同数字的集合,返回所有可能的全排列.比如,[1,2,3] 具有如下排列:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2 ...
- nio aio netty区别
传统io就是bio 同步阻塞 但可以采用伪同步 nio jdk1.7以前 同步非阻塞io 1.7以后 同步异步非阻塞 ...
- 对于拼接进去的html原来绑定的jq事件失效
JQ拼接显示的页面中鼠标事件失效 由于是先加载html在用js层绑定的所有后来加进来的html内容就不再绑定js了 所以我们需要利用delegate绑定,但是同样道理也不能写在普通的方法层里,因为这样 ...