BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆 [线段树]
题意:
操作1:找长为$len$的空区间并填满,没有输出$0$
操作2:将$[l,r]$之间的区间置空
我真是太弱了这种线段树还写了一个半小时,中间为了查错手动模拟了$30min$线段树操作,然后发现$zz$的寻找时没有单独判断跨过中间的情况,自以为看一下$t[x].pos$就可以了...
然后交到洛谷$T$了一个点,交到$BZOJ$跑了$7s$度人家都是不到半秒,突然发现自己的寻找是$nlogn$的......然后改成$logn$又出了点小问题无奈加上了判断$l==r$.....我太弱了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define lc x<<1
#define rc x<<1|1
#define mid ((l+r)>>1)
#define lson lc,l,mid
#define rson rc,mid+1,r
const int N=1e5+,INF=1e9;
typedef long long ll;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
} int n,Q,op,p,len;
struct Node{
int mx,lm,rm,pos,rpos;
int tag;
Node():mx(),lm(),rm(){}
void debug(){printf("%d %d %d %d %d %d\n",mx,lm,rm,pos,rpos,tag);}
}t[N<<]; inline void merge(int x,int l,int r){
if(t[lc].mx>t[rc].mx)
t[x].mx=t[lc].mx,t[x].pos=t[lc].pos;
else t[x].mx=t[rc].mx,t[x].pos=t[rc].pos;
if(t[lc].rm+t[rc].lm>t[x].mx) t[x].mx=t[lc].rm+t[rc].lm,t[x].pos=t[lc].rpos; if(t[lc].lm==mid-l+) t[x].lm=t[lc].lm+t[rc].lm;
else t[x].lm=t[lc].lm;
if(t[rc].rm==r-mid&&t[lc].rm)
t[x].rm=t[rc].rm+t[lc].rm,t[x].rpos=t[lc].rpos;
else t[x].rm=t[rc].rm, t[x].rpos=t[rc].rpos;
} inline void paint(int x,int l,int r,int v){
t[x].tag=v;
if(v==) t[x].mx=t[x].lm=t[x].rm=,t[x].pos=t[x].rpos=INF;
else t[x].mx=t[x].lm=t[x].rm=r-l+,t[x].pos=t[x].rpos=l;
}
inline void pushDown(int x,int l,int r){
if(t[x].tag){
paint(lson,t[x].tag);
paint(rson,t[x].tag);
t[x].tag=;
}
}
void build(int x,int l,int r){
if(l==r) t[x].mx=t[x].lm=t[x].rm=,t[x].pos=t[x].rpos=l;
else{
build(lson);
build(rson);
merge(x,l,r);
}
//printf("build %d %d %d \n",x,l,r);
//t[x].debug();
} void segAdd(int x,int l,int r,int ql,int qr,int v){//printf("segAdd %d %d %d\n",x,l,r);
if(ql<=l&&r<=qr) paint(x,l,r,v);
else{
pushDown(x,l,r);
if(ql<=mid) segAdd(lson,ql,qr,v);
if(mid<qr) segAdd(rson,ql,qr,v);
merge(x,l,r);
}
//printf("segAdd %d %d %d\n",x,l,r);
//t[x].debug();
} int segFin(int x,int l,int r,int len){//printf("segFin %d %d %d %d %d\n",x,l,r,len,t[x].mx);
if(l==r) return l;
if(t[x].mx<len) return INF;
else{
pushDown(x,l,r);
if(t[lc].mx>=len) return segFin(lson,len);
else if(t[lc].rm+t[rc].lm>=len&&t[lc].rm) return t[lc].rpos;
else return segFin(rson,len);
}
} inline void Query1(int len){
if(t[].mx<len) puts("");
else{
int ans=segFin(,,n,len);
printf("%d\n",ans);
segAdd(,,n,ans,ans+len-,);//printf("ql qr %d %d\n",ans,ans+len-1);
}
}
inline void Query2(int ql,int qr){
segAdd(,,n,ql,qr,-);
} int main(){
freopen("in","r",stdin);
//freopen("out","w",stdout);
n=read();Q=read();
build(,,n);
for(int id=;id<=Q;id++){//printf("Q %d %d\n",id,t[1<<1].mx);
op=read();
if(op==) len=read(),Query1(len);
else p=read(),len=read(),Query2(p,p+len-);
}
}
BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆 [线段树]的更多相关文章
- bzoj1593 [Usaco2008 Feb]Hotel 旅馆(线段树)
1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 758 Solved: 419[Submit ...
- bzoj 1593: [Usaco2008 Feb]Hotel 旅馆【线段树】
参考:https://blog.csdn.net/u010336344/article/details/53034372 神一样的线段树 线段树上维护:ll从左开始最长空段:rr从右开始最长空段:le ...
- 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并
题目描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
- BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆
Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 &l ...
- 1593: [Usaco2008 Feb]Hotel 旅馆
1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 391 Solved: 228[Submit ...
- 【BZOJ】1593: [Usaco2008 Feb]Hotel 旅馆
[算法]线段树(经典线段树上二分) [题意]n个房间,m个询问,每次订最前的连续x个的空房间,或退订从x开始y个房间,求每次订的最左房间号. [题解]关键在于找连续x个空房间,经典二分. 线段树标记s ...
- 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel
题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...
- 【最长连续零 线段树】bzoj1593: [Usaco2008 Feb]Hotel 旅馆
最长连续零的线段树解法 Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负 责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大 ...
- BZOJ1593 [Usaco2008 Feb]Hotel 旅馆
裸上线段树,就是记的东西有点多... 每个点记区间左端最长0,右端最长0,中间最长0,和tag表示是否全为0/1 直接更新就好,查询的时候先查左儿子,然后查中间,最后查右儿子... /******** ...
随机推荐
- linux下python2升级python3,python2和python3并存
wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz 解压:tar -xzvf Python-3.6.4.tgz cd Pytho ...
- Netty5序章之BIO NIO AIO演变
Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...
- fireasy 使用篇 - 简介
一.Fireasy 简介 Fireasy是一套基于.Net Framework应用开发组件,其主旨思想为“让开发变为更简单”,其义为,使用尽可能少的组件,实现你所需的功能.Fireasy几乎覆盖了开发 ...
- 微信小程序 PHP后端form表单提交实例详解
微信小程序php后端form表单 https://www.cnblogs.com/tdalcn/p/7092716.html 1.小程序相对于之前的WEB+PHP建站来说,个人理解为只是将web放到了 ...
- move_uploaded_file
move_uploaded_file() 函数将上传的文件移动到新位置. 若成功,则返回 true,否则返回 false. 语法 move_uploaded_file(file,newloc) 参数 ...
- str_repeat() 函数把字符串重复指定的次数。
str_repeat() 函数把字符串重复指定的次数. str_repeat(string,repeat) 参数 描述 string 必需.规定要重复的字符串. repeat 必需.规定字符串将被重复 ...
- mysql 批量更新与批量更新多条记录的不同值实现方法
作者: 字体:[增加 减小] 类型:转载 时间:2013-10-02 我要评论 在mysql中批量更新我们可能使用update,replace into来操作,下面小编来给各位同学详细介绍mysql ...
- log4j配置文件简要记录
和大多数配置文件一样,log4j配置文件也有key-value形式和xml形式.这里主要记录一下key-value的形式 我们通过配置,可以创建出Log4j的运行环境.Log4j由三个重要的组件构成: ...
- Python3基础知识之元组、集合、字典
1.元组 元组特点元组是不可变的两个元组可以做加法,不能做减法 元组的方法 >>> S('a', 'b', 'c', 'd', 'e')>>> S=('a','b' ...
- 前端css常用class命名id命名
1.常用id的命名: (1)页面结构 容器: container 页头:header 内容:content/container 页面主体:main 页尾:footer 导航:nav 侧栏:sideba ...