【bzoj1593-预定旅馆】线段树维护连续区间
题解:
这题非常经典啊似乎。。经典模型要记住啊。。
对于每个节点维护该区间里的最大的连续区间,然后我们就可以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-预定旅馆】线段树维护连续区间相关推荐
- 线段树维护(最大区间和,最大子段和,最长连续上升子序列)
本文主要介绍用线段树来维护(最大区间和,最大子段和,最长连续上升子序列)的问题. HDU 1540 Tunnel Warfare(最长连续区间+单点修改) 洛谷 P2894 [USACO08FEB]酒 ...
- [动态dp]线段树维护转移矩阵
背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...
- Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)
题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...
- [SDOI2011]染色 (线段树维护子段问题+树剖)
题意: 给定一棵 n 个节点的无根树,共有 m 个操作,操作分为两种: 1.将节点 a 到节点 b 的路径上的所有点(包括 a 和 b)都染成颜色 c. 2.询问节点 a 到节点 b 的路径上的颜色段 ...
- Can you answer these queries III (线段树维护最大子段和)
题意: 求一个区间的最大连续和. 0:表示把A[x]改成y 1:表示求[x,y]这个区间的最大连续和. 题解: 线段树维护四个变量. 倒着讲,先来看如何维护这四个变量. summax代表这个区间连续最 ...
- 线段树 ---- D. Power Tree(离线dfs序+线段树维护树上多条路径和的技巧)
题目链接 题目大意: 一开始给你只有一个点111的树,有qqq次询问.每次询问有两种操作 1pv1\;p\;v1pv 就是把最小的没加入的点,加入这个树,它的父亲是ppp,权值是vvv 2u2\;u2 ...
- 【uoj#164】[清华集训2015]V 线段树维护历史最值
题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ : $2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ , ...
- 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 ...
- CodeForces - 1252K Addition Robot(线段树维护矩阵)
题目链接:点击查看 题目大意:给出一个只由 A 和 B 组成的字符串 s ,需要完成 m 次操作,每次操作分为两种类型: 1 l r :将 [ l , r ] 内的字符串 A 变成 B,B 变成 A ...
- 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 ...
最新文章
- Java 线程 笔记(1)
- C++中的静态绑定与动态绑定
- 《IT咨询指南》读书笔记一开卷 前言
- Android学习笔记18:自定义Seekbar拖动条式样
- ppt讲解html,HTML讲解解读.ppt
- Go语言-defer的使用
- 如何恢复回收站清空的文件?简单步骤教你操作
- [笔记]如何解决Your project contains C++ files but it is not using a supported native build system
- PowerDesiger导出简洁数据字典
- Postman 接口压力测试
- 思科、华为路由器破解过程
- python拆分excel列_python自动化办公:实现按照一列内容拆分excel
- win10如何录制内部声音(非麦克风录音)
- LeetCode 01:有人相爱,有人夜里开车看海,有人LeetCode第一题都做不出来
- javax.validation.Validation使用方法
- 分布式文件存储:FastDFS简单使用与原理分析
- 前端实战:教你写出简单的侧边栏功能以及返回顶部特效
- java网课|匿名对象Random对象数组
- 基于python的学生信息管理系统文献综述_学生信息管理系统的文献综述
- Java list转tree,tree转list(递归实现)
热门文章
- kubernetes视频教程笔记 (6)-kubernetes集群安装
- 微信模板消息400001:invalid credential, access_token is invalid or not latest
- 造梦西游外传服务器维护,造梦西游外传V3.5.9版本更新公告 “无限火力”限时开放...
- python超市管理系统总汇总功能解说_AdminModules --- 管理模块
- Linux 挂载华为存储,linux扫描挂载存储
- java rome,ROME - RSS聚合类库 - 组件类库 - JAVA开源项目 - 开源吧
- JVM常量池和八种基本数据及字符串
- 哈夫曼思维导图,第六章前半段思维导图
- UPUPW PHP环境集成包,增加多个PHP版本支持,可选择使用
- Codeforces1037G A Game on Strings 【SG函数】【区间DP】