【bzoj1593-预定旅馆】线段树维护连续区间

题解:
这题非常经典啊似乎。。经典模型要记住啊。。
对于每个节点维护该区间里的最大的连续区间,然后我们就可以logn递归找最前面的一段。
那就维护mx(无限制),lmx(必须从左边开始),rmx(必须从右边开始)。
代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<ctime>
#include<queue>
#include<algorithm>
using namespace std; const int N=;
int n,m,tl;
struct trnode{
int l,r,lc,rc,mx,lmx,rmx,len,lazy;
}t[*N]; int minn(int x,int y){return x<y ? x:y;}
int maxx(int x,int y){return x>y ? x:y;} int bt(int l,int r)
{
int x=++tl;
t[x].l=l;t[x].r=r;
t[x].lc=t[x].rc=;
t[x].lazy=-;t[x].len=r-l+;
t[x].lmx=t[x].rmx=t[x].mx=t[x].len;
if(l<r)
{
int mid=(l+r)/;
t[x].lc=bt(l,mid);
t[x].rc=bt(mid+,r);
}
return x;
} void pd(int x)
{
if(t[x].lazy==-) return ;
int d=t[x].lazy,lc=t[x].lc,rc=t[x].rc,l=t[x].l,r=t[x].r;
t[x].lazy=-;
if(d==) t[x].mx=t[x].lmx=t[x].rmx=t[x].len;
else t[x].mx=t[x].lmx=t[x].rmx=;
if(lc) t[lc].lazy=d;
if(rc) t[rc].lazy=d;
} void upd(int x)
{
int lc=t[x].lc,rc=t[x].rc;
pd(x);pd(lc);pd(rc);
t[x].lmx=t[lc].lmx;
if(t[lc].lmx==t[lc].len) t[x].lmx+=t[rc].lmx;
t[x].rmx=t[rc].rmx;
if(t[rc].rmx==t[rc].len) t[x].rmx+=t[lc].rmx;
t[x].mx=maxx(maxx(maxx(t[x].lmx,t[x].rmx),t[lc].rmx+t[rc].lmx),maxx(t[lc].mx,t[rc].mx));//debug 一开始这里忘了取lc和rc的mx了。
} void change(int x,int l,int r,int d)
{
pd(x);
if(t[x].l==l && t[x].r==r) {t[x].lazy=d;pd(x);return ;}
int lc=t[x].lc,rc=t[x].rc,mid=(t[x].l+t[x].r)/;
if(r<=mid) change(lc,l,r,d);
else if(l>mid) change(rc,l,r,d);
else
{
change(lc,l,mid,d);
change(rc,mid+,r,d);
}
upd(x);
} int query(int x,int len)
{
pd(x);
int k,lc=t[x].lc,rc=t[x].rc;
if(t[x].mx>=len)
{
if(t[x].lmx>=len) return t[x].l;
if((k=query(lc,len)) > ) return k;
if(t[lc].rmx+t[rc].lmx>=len) return t[lc].r-t[lc].rmx+;
if((k=query(rc,len)) > ) return k;
}
return ;
} int main()
{
// freopen("a.in","r",stdin);
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&m);
tl=;
bt(,n);
for(int i=;i<=m;i++)
{
int tmp,x,len;
scanf("%d",&tmp);
if(tmp==)
{
scanf("%d",&len);
x=query(,len);
printf("%d\n",x);
if(x>) change(,x,x+len-,);
}
else
{
scanf("%d%d",&x,&len);
change(,x,x+len-,);
}
}
return ;
}
【bzoj1593-预定旅馆】线段树维护连续区间的更多相关文章
- HDU-4553 约会安排(线段树维护连续区间)
http://acm.hdu.edu.cn/showproblem.php?pid=4553 Problem Description 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但 ...
- 洛谷 P4747 [CERC2017]Intrinsic Interval 线段树维护连续区间
题目描述 题目传送门 分析 考虑对于 \([l,r]\),如何求出包住它的长度最短的好区间 做法就是用一个指针从 \(r\) 向右扫,每次查询以当前指针为右端点的最短的能包住 \([l,r]\) 的好 ...
- FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解
题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区 ...
- Tunnel Warfare(线段树取连续区间)
emmmmmmmm我菜爆了 思路来自:https://blog.csdn.net/chudongfang2015/article/details/52133243 线段树最难的应该就是要维护什么东西 ...
- Tunnel Warfare HDU - 1540 (线段树处理连续区间问题)
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...
- 2016shenyang-1002-HDU5893-List wants to travel-树链剖分+线段树维护不同区间段个数
肯定先无脑树链剖分,然后线段树维护一段区间不同个数,再维护一个左右端点的费用. 线段树更新,pushDown,pushUp的时候要注意考虑链接位置的费用是否相同 还有就是树链剖分操作的时候,维护上一个 ...
- Codeforces GYM 100114 D. Selection 线段树维护DP
D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...
- [BZOJ 3995] [SDOI2015] 道路修建 【线段树维护连通性】
题目链接:BZOJ - 3995 题目分析 这道题..是我悲伤的回忆.. 线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过 1018,即使它在 ProblemSet 的第一页 ...
- [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】
题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...
随机推荐
- 第三次寒假作业 sketch 了解
什么是sketch? sketch 是一种基于散列的数据结构,可以在高速网络环境中,实时地存储流量特征信息,只占用较小的空间资源,并且具备在理论上可证明的估计精度与内存的平衡特性. 通过设置散列函数, ...
- 3ds Max学习日记(一)
暑假闲来无事学习一发3ds Max.为啥要学这玩意?貌似可以用这东西三维建模.暑期生产实习选了一个搞vr的导师,貌似他忙得很,无奈只好先自己研究一下啦~ vr神马的还是有点意思的,虽然自己仅仅 ...
- svmtrain输入参数介绍【转】
-s svm类型:SVM设置类型(默认0) 0 -- C-SVC 1 --v-SVC 2 – 一类SVM 3 -- e -SVR 4 -- v-SVR -t 核函数类型:核函数设置类型(默认2) 0 ...
- Delphi XE4 TStringHelper用法详解
原文地址:Delphi XE4 TStringHelper用法详解作者:天下为公 Delphi XE4的TStringHelper,对操作字符串进一步带来更多的方法,估计XE5还能继续用到. Syst ...
- Windows7系统目录迁移:Users,Progr…
微软设计了比如:我的文档.我的OOXX,之类的东西,在WIN7下面更连游戏.下载等等目录都设计好了,我也很乖巧的把各种文件都分门别类的放进去了. 同时也很厉害的设计在了“%HOMEDRIVE%”里面, ...
- 【bzoj1712】[Usaco2007 China]Summing Sums 加密 矩阵乘法
题目描述 那N只可爱的奶牛刚刚学习了有关密码的许多算法,终于,她们创造出了属于奶牛的加密方法.由于她们并不是经验十足,她们的加密方法非常简单:第i只奶牛掌握着密码的第i个数字,起始的时候是Ci(0≤C ...
- Codeforces Round #521 Div. 3 玩耍记
A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
- hdu 1054 Strategic Game (二分匹配)
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- python-输出颜色显示
显示颜色格式:\033[显示方式;字体色;背景色m...主题内容hello world...\033[0m \033 从这里开始标颜色................................. ...
- 【刷题】BZOJ 2744 [HEOI2012]朋友圈
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...