题解:

这题非常经典啊似乎。。经典模型要记住啊。。

对于每个节点维护该区间里的最大的连续区间,然后我们就可以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-预定旅馆】线段树维护连续区间的更多相关文章

  1. HDU-4553 约会安排(线段树维护连续区间)

    http://acm.hdu.edu.cn/showproblem.php?pid=4553 Problem Description 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但 ...

  2. 洛谷 P4747 [CERC2017]Intrinsic Interval 线段树维护连续区间

    题目描述 题目传送门 分析 考虑对于 \([l,r]\),如何求出包住它的长度最短的好区间 做法就是用一个指针从 \(r\) 向右扫,每次查询以当前指针为右端点的最短的能包住 \([l,r]\) 的好 ...

  3. FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解

    题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区 ...

  4. Tunnel Warfare(线段树取连续区间)

    emmmmmmmm我菜爆了 思路来自:https://blog.csdn.net/chudongfang2015/article/details/52133243 线段树最难的应该就是要维护什么东西 ...

  5. Tunnel Warfare HDU - 1540 (线段树处理连续区间问题)

    During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...

  6. 2016shenyang-1002-HDU5893-List wants to travel-树链剖分+线段树维护不同区间段个数

    肯定先无脑树链剖分,然后线段树维护一段区间不同个数,再维护一个左右端点的费用. 线段树更新,pushDown,pushUp的时候要注意考虑链接位置的费用是否相同 还有就是树链剖分操作的时候,维护上一个 ...

  7. Codeforces GYM 100114 D. Selection 线段树维护DP

    D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...

  8. [BZOJ 3995] [SDOI2015] 道路修建 【线段树维护连通性】

    题目链接:BZOJ - 3995 题目分析 这道题..是我悲伤的回忆.. 线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过  1018,即使它在 ProblemSet 的第一页 ...

  9. [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】

    题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...

随机推荐

  1. 算法与数据结构3.1 stack

    ★实验任务 一天,小 L 发现了一台支持一下操作的机器: IN x:将整数 x 入栈 POP:将栈顶元素出栈 ASUB:出栈两个数,将两数差的绝对值入栈 COPY:将栈顶元素(如果有的话)复制一份,入 ...

  2. (七)类、超类和子类 ——(多态,动态绑定,final类,类型转换,抽象类)

    java中所有的继承都是公有继承. 在子类中的构造其内可以初始化超类的公有域,但不能初始化超类的私有域. 因此需要在子类构造前的第一行使用super()语句初始化超类的私有域. 如果超类没有不带参数的 ...

  3. TCP系列04—连接管理—3、TCP连接的半打开和半关闭

    在前面部分我们我们分别介绍了三次握手.四次挥手.同时打开和同时关闭,TCP连接还有两种场景分别是半打开(Half-Open)连接和半关闭(Half-Close)连接.TCP是一个全双工(Full-Du ...

  4. 【MVC4升级到MVC5】ASP.Net MVC 4项目升级MVC 5的方法

    1.备份你的项目 2.从Web API升级到Web API 2,修改global.asax,将 ? 1 WebApiConfig.Register(GlobalConfiguration.Config ...

  5. noauth authentication required redis

    解决方案: 这是出现了认证的问题,是因为设置了认证密码. 127.0.0.1:6379> auth "yourpassword" 例如:

  6. winform中文本框添加拖拽功能

    对一个文本框添加拖拽功能: private void txtFolder_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataP ...

  7. 将下载到本地的JAR包手动添加到Maven仓库(转)

    常用Maven仓库网址:http://mvnrepository.com/http://search.maven.org/http://repository.sonatype.org/content/ ...

  8. Luogu1041 NOIP2003传染病控制(搜索)

    暴搜加个最优性剪枝即可.一直觉得正式比赛出这种不能一眼看出来暴搜就行了的搜索题的出题人都是毒瘤. #include<iostream> #include<cstdio> #in ...

  9. 【题解】NOI2016区间

    Two - pointer 第一题…… 大概就是对于一段连续的区间求解,使用两个指针不断卡区间的长度直到区间不满足条件吧. 这题只要对区间以长度从小到大排一下序,然后使用两个指针指向区间.线段树维护被 ...

  10. [bzoj3712][PA2014]Fiolki

    description 题面 data range \[ 0\le m<n\le 200000,0\le k\le 500000\] solution 之前本人一直煞笔地思考暴力是否可行 考虑按 ...