题解:

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

对于每个节点维护该区间里的最大的连续区间,然后我们就可以logn递归找最前面的一段。

那就维护mx(无限制),lmx(必须从左边开始),rmx(必须从右边开始)。

代码:

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<iostream>
  5 #include<ctime>
  6 #include<queue>
  7 #include<algorithm>
  8 using namespace std;
  9
 10 const int N=50010;
 11 int n,m,tl;
 12 struct trnode{
 13     int l,r,lc,rc,mx,lmx,rmx,len,lazy;
 14 }t[2*N];
 15
 16 int minn(int x,int y){return x<y ? x:y;}
 17 int maxx(int x,int y){return x>y ? x:y;}
 18
 19 int bt(int l,int r)
 20 {
 21     int x=++tl;
 22     t[x].l=l;t[x].r=r;
 23     t[x].lc=t[x].rc=0;
 24     t[x].lazy=-1;t[x].len=r-l+1;
 25     t[x].lmx=t[x].rmx=t[x].mx=t[x].len;
 26     if(l<r)
 27     {
 28         int mid=(l+r)/2;
 29         t[x].lc=bt(l,mid);
 30         t[x].rc=bt(mid+1,r);
 31     }
 32     return x;
 33 }
 34
 35 void pd(int x)
 36 {
 37     if(t[x].lazy==-1) return ;
 38     int d=t[x].lazy,lc=t[x].lc,rc=t[x].rc,l=t[x].l,r=t[x].r;
 39     t[x].lazy=-1;
 40     if(d==0) t[x].mx=t[x].lmx=t[x].rmx=t[x].len;
 41     else t[x].mx=t[x].lmx=t[x].rmx=0;
 42     if(lc) t[lc].lazy=d;
 43     if(rc) t[rc].lazy=d;
 44 }
 45
 46 void upd(int x)
 47 {
 48     int lc=t[x].lc,rc=t[x].rc;
 49     pd(x);pd(lc);pd(rc);
 50     t[x].lmx=t[lc].lmx;
 51     if(t[lc].lmx==t[lc].len) t[x].lmx+=t[rc].lmx;
 52     t[x].rmx=t[rc].rmx;
 53     if(t[rc].rmx==t[rc].len) t[x].rmx+=t[lc].rmx;
 54     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了。
 55 }
 56
 57 void change(int x,int l,int r,int d)
 58 {
 59     pd(x);
 60     if(t[x].l==l && t[x].r==r) {t[x].lazy=d;pd(x);return ;}
 61     int lc=t[x].lc,rc=t[x].rc,mid=(t[x].l+t[x].r)/2;
 62     if(r<=mid) change(lc,l,r,d);
 63     else if(l>mid) change(rc,l,r,d);
 64     else
 65     {
 66         change(lc,l,mid,d);
 67         change(rc,mid+1,r,d);
 68     }
 69     upd(x);
 70 }
 71
 72 int query(int x,int len)
 73 {
 74     pd(x);
 75     int k,lc=t[x].lc,rc=t[x].rc;
 76     if(t[x].mx>=len)
 77     {
 78         if(t[x].lmx>=len) return t[x].l;
 79         if((k=query(lc,len)) > 0) return k;
 80         if(t[lc].rmx+t[rc].lmx>=len) return t[lc].r-t[lc].rmx+1;
 81         if((k=query(rc,len)) > 0) return k;
 82     }
 83     return 0;
 84 }
 85
 86 int main()
 87 {
 88     // freopen("a.in","r",stdin);
 89     freopen("hotel.in","r",stdin);
 90     freopen("hotel.out","w",stdout);
 91     scanf("%d%d",&n,&m);
 92     tl=0;
 93     bt(1,n);
 94     for(int i=1;i<=m;i++)
 95     {
 96         int tmp,x,len;
 97         scanf("%d",&tmp);
 98         if(tmp==1)
 99         {
100             scanf("%d",&len);
101             x=query(1,len);
102             printf("%d\n",x);
103             if(x>0) change(1,x,x+len-1,1);
104         }
105         else
106         {
107             scanf("%d%d",&x,&len);
108             change(1,x,x+len-1,0);
109         }
110     }
111     return 0;
112 }

转载于:https://www.cnblogs.com/KonjakJuruo/p/6019493.html

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

  1. 线段树维护(最大区间和,最大子段和,最长连续上升子序列)

    本文主要介绍用线段树来维护(最大区间和,最大子段和,最长连续上升子序列)的问题. HDU 1540 Tunnel Warfare(最长连续区间+单点修改) 洛谷 P2894 [USACO08FEB]酒 ...

  2. [动态dp]线段树维护转移矩阵

    背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...

  3. Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)

    题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...

  4. [SDOI2011]染色 (线段树维护子段问题+树剖)

    题意: 给定一棵 n 个节点的无根树,共有 m 个操作,操作分为两种: 1.将节点 a 到节点 b 的路径上的所有点(包括 a 和 b)都染成颜色 c. 2.询问节点 a 到节点 b 的路径上的颜色段 ...

  5. Can you answer these queries III (线段树维护最大子段和)

    题意: 求一个区间的最大连续和. 0:表示把A[x]改成y 1:表示求[x,y]这个区间的最大连续和. 题解: 线段树维护四个变量. 倒着讲,先来看如何维护这四个变量. summax代表这个区间连续最 ...

  6. 线段树 ---- D. Power Tree(离线dfs序+线段树维护树上多条路径和的技巧)

    题目链接 题目大意: 一开始给你只有一个点111的树,有qqq次询问.每次询问有两种操作 1pv1\;p\;v1pv 就是把最小的没加入的点,加入这个树,它的父亲是ppp,权值是vvv 2u2\;u2 ...

  7. 【uoj#164】[清华集训2015]V 线段树维护历史最值

    题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ : $2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ , ...

  8. Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp

    D. Babaei and Birthday Cake 题目连接: http://www.codeforces.com/contest/629/problem/D Description As you ...

  9. CodeForces - 1252K Addition Robot(线段树维护矩阵)

    题目链接:点击查看 题目大意:给出一个只由 A 和 B 组成的字符串 s ,需要完成 m 次操作,每次操作分为两种类型: 1 l r :将 [ l , r ] 内的字符串 A 变成 B,B 变成 A ...

  10. Can you answer these queries V SPOJ - GSS5 (分类讨论+线段树维护区间最大子段和)

    recursion有一个整数序列a[n].现在recursion有m次询问,每次她想知道Max { A[i]+A[i+1]+...+A[j] ; x1 <= i <= y1 , x2 &l ...

最新文章

  1. Java 线程 笔记(1)
  2. C++中的静态绑定与动态绑定
  3. 《IT咨询指南》读书笔记一开卷 前言
  4. Android学习笔记18:自定义Seekbar拖动条式样
  5. ppt讲解html,HTML讲解解读.ppt
  6. Go语言-defer的使用
  7. 如何恢复回收站清空的文件?简单步骤教你操作
  8. [笔记]如何解决Your project contains C++ files but it is not using a supported native build system
  9. PowerDesiger导出简洁数据字典
  10. Postman 接口压力测试
  11. 思科、华为路由器破解过程
  12. python拆分excel列_python自动化办公:实现按照一列内容拆分excel
  13. win10如何录制内部声音(非麦克风录音)
  14. LeetCode 01:有人相爱,有人夜里开车看海,有人LeetCode第一题都做不出来
  15. javax.validation.Validation使用方法
  16. 分布式文件存储:FastDFS简单使用与原理分析
  17. 前端实战:教你写出简单的侧边栏功能以及返回顶部特效
  18. java网课|匿名对象Random对象数组
  19. 基于python的学生信息管理系统文献综述_学生信息管理系统的文献综述
  20. Java list转tree,tree转list(递归实现)

热门文章

  1. kubernetes视频教程笔记 (6)-kubernetes集群安装
  2. 微信模板消息400001:invalid credential, access_token is invalid or not latest
  3. 造梦西游外传服务器维护,造梦西游外传V3.5.9版本更新公告 “无限火力”限时开放...
  4. python超市管理系统总汇总功能解说_AdminModules --- 管理模块
  5. Linux 挂载华为存储,linux扫描挂载存储
  6. java rome,ROME - RSS聚合类库 - 组件类库 - JAVA开源项目 - 开源吧
  7. JVM常量池和八种基本数据及字符串
  8. 哈夫曼思维导图,第六章前半段思维导图
  9. UPUPW PHP环境集成包,增加多个PHP版本支持,可选择使用
  10. Codeforces1037G A Game on Strings 【SG函数】【区间DP】