这题就491个accepted,还挺吓人的,别被吓住哈,其实我被吓住了,嘻嘻,这泥玛做也是悲剧,但看分类上说属于中等题,我就猛憋一股气,三A ,呵呵

这个题我们这需要在线段上用ml,mr,len表示左面有几个连续空位,右面有几个连续空位,中间有几个连续空位

在和并的时候注意更新规则

a[i].len=max(a[i*2].mr+a[i*2+1].ml,max(a[i*2].len,a[i*2+1].len));//这个好想 更新中间len的值if(a[i*2+1].ml==(a[i*2+1].r-a[i*2+1].l+1))//如果右面孩子的ml=线段长度,也就是说右面孩子是全空的,那a[i].ml就是a[i*2].mr+右边整个长度a[i].mr=a[i*2].mr+a[i*2+1].ml;elsea[i].mr=a[i*2+1].mr;//如果说右面孩子是不是全空的,那a[i].mr久等于a[i*2+1].mrif(a[i*2].mr==(a[i*2].r-a[i*2].l+1))//同上a[i].ml=a[i*2+1].ml+a[i*2].mr;elsea[i].ml=a[i*2].ml;//

还有就是懒惰标记啦,不标记就超时啦

#include<iostream>
#include<cstdio>
using namespace std;
#define N 16005
struct node{int l,r,ml,mr,mm,len,sign;
}a[N*4];
void build(int i,int left,int right){a[i].l=left;a[i].r=right;a[i].len=a[i].ml=a[i].mr=right-left+1;a[i].mm=0;a[i].sign=0;//表示这条边是否被用过if(left==right) return ;int mid=(a[i].l+a[i].r)>>1;build(i*2,left,mid);build(i*2+1,mid+1,right);
}
void insert(int i,int left,int right,int sign){
//    cout<<a[i].l<<" "<<a[i].r<<"****"<<left<<" "<<right<<endl;if(a[i].l>=left&&a[i].r<=right){a[i].sign=1;if(sign==1){a[i].len=a[i].ml=a[i].mr=0;}else{a[i].len=a[i].ml=a[i].mr=(a[i].r-a[i].l+1);}return ;}if(a[i].sign==1&&a[i].ml==0&&a[i].mr==0&&a[i].len==0){//懒惰标记a[i*2+1].ml=a[i*2+1].mr=a[i*2+1].len=0;a[i*2].ml=a[i*2].mr=a[i*2].len=0;a[i*2+1].sign=a[i*2].sign=1;a[i].sign=0;}if(a[i].sign==1&&a[i].ml==(a[i].r-a[i].l+1)&&a[i].mr==(a[i].r-a[i].l+1)&&a[i].len==(a[i].r-a[i].l+1)){//懒惰标记a[i*2+1].ml=a[i*2+1].mr=a[i*2+1].len=(a[i*2+1].r-a[i*2+1].l+1);a[i*2].ml=a[i*2].mr=a[i*2].len=(a[i*2].r-a[i*2].l+1);a[i*2+1].sign=a[i*2].sign=1;a[i].sign=0;}int mid=(a[i].l+a[i].r)>>1;if(right<=mid) insert(i*2,left,right,sign);else if(left>mid) insert(i*2+1,left,right,sign);else{insert(i*2,left,mid,sign);insert(i*2+1,mid+1,right,sign);}a[i].len=max(a[i*2].mr+a[i*2+1].ml,max(a[i*2].len,a[i*2+1].len));if(a[i*2+1].ml==(a[i*2+1].r-a[i*2+1].l+1))a[i].mr=a[i*2].mr+a[i*2+1].ml;elsea[i].mr=a[i*2+1].mr;if(a[i*2].mr==(a[i*2].r-a[i*2].l+1))a[i].ml=a[i*2+1].ml+a[i*2].mr;elsea[i].ml=a[i*2].ml;//   cout<<"l="<<a[i].l<<" r="<<a[i].r<<" "<<a[i].ml<<" "<<a[i].len<<" "<<a[i].mr<<endl;
}int main(){int n,p,m,x,y;while(~scanf("%d%d",&n,&p)){build(1,1,n);while(p--){scanf("%d",&m);if(m==1){scanf("%d%d",&x,&y);
//                cout<<"x+y-1="<<x+y-1<<endl;insert(1,x,x+y-1,1);}else if(m==2){scanf("%d%d",&x,&y);insert(1,x,x+y-1,0);}elseprintf("%d\n",max(a[1].ml,max(a[1].len,a[1].mr)));}}
}

poj 1823 Hotel 线段树,注意懒惰标记,不标记就会超时滴相关推荐

  1. 【转】poj 1823 hotel 线段树【Good】

    题意:一个hotel,有n个连续的房间,开始时均无人住宿 共有3种操作 1 a b 从a开始连续b个房间全部旅客住宿 [a,a+b-1]; 2 a b 从a开始连续b个房间全部旅客离开 [a,a+b- ...

  2. POJ 3667 Hotel 线段树区间合并

    线段树的区间合并,其中lsum代表区间左边最大连续长度,rsum代表区间最大连续长度,msum代表区间 最大连续长度.因为本题是查询连续区间的左端点,那么如果左儿子满足条件,就继续查询左儿子,左儿 子 ...

  3. A Simple Problem with Integers POJ - 3468(线段树+区间查询+区间修改+建树+懒惰标记模板)+(树状数组)

    题意: 有一个数组,有两种操作.1: Q a b 求[a,b]的和 2:C a b c 给[a,b] 的所有元素都加上c. 题目: You have N integers, A1, A2, ... , ...

  4. POJ 2352 Stars (线段树)

    POJ 2352 Stars (线段树) 手动博客搬家:本文发表于20170819 22:11:49, 原地址https://blog.csdn.net/suncongbo/article/detai ...

  5. poj Hotel 线段树

    经典线段树的题. 每个节点存储的信息:左端点连续空房间的长度,右端点连续空房间长度,连续空房间的最大长度. 由于要求每次必须从尽量靠左边的位置进行居住,那么搜索时应尽量让区间起始位置更小: 1.如果当 ...

  6. poj 2352 Stars 线段树(先建后查/边建边查)/树状数组三种方法思路详解,带你深入了解线段树难度⭐⭐⭐★

    poj 2352 Stars 目录 poj 2352 Stars 1.树状数组 2.线段树,先建树后查找 3.线段树,边建树边查找 Description Astronomers often exam ...

  7. poj 2352 Stars(线段树)

    题目:http://poj.org/problem?id=2352 大意:一些星星有自己的优先级,优先级是x坐标和y坐标小于等于该星星坐标的星星个数 思路:由于这个题的y值是从小到大排列,所以对x建立 ...

  8. POJ 1151 扫描线 线段树

    题意:给定平面直角坐标系中的N个矩形,求它们的面积并. 题解:建立一个四元组(x,y1,y2,k).(假设y1<y2)用来储存每一条线,将每一条线按x坐标排序.记录所有的y坐标以后排序离散化.离 ...

  9. POJ 2299 Ultra-QuickSort(线段树+离散化)

    题目地址:POJ 2299 这题以前用归并排序做过.线段树加上离散化也能够做.一般线段树的话会超时. 这题的数字最大到10^10次方,显然太大,可是能够利用下标,下标总共仅仅有50w.能够从数字大的開 ...

  10. nyoj 1217 GLaDOS的耳机(线段树,开两个标记数组维护)

    1217-GLaDOS的耳机 内存限制:64MB时间限制:3000msSpecial Judge: No accepted:8submit:40 题目描述: GLaDOS是个耳机控.对于他来说,已经不 ...

最新文章

  1. python中,如何将多行进行输出,同时将行尾的换行符去掉
  2. Golang的指针类型
  3. mysql实战17 | 如何正确地显示随机消息?
  4. shell启动oracle客户端,Shell实现的Oracle启动脚本分享
  5. php在图片左上角加入水印,如何在PHP中将图像添加到图像上,如水印
  6. 链接地址中的target=”_blank”属性安全性处理
  7. html中的form是空标签么,关于html 中form表单的内标签和使用
  8. BackTrack5 下破解无线
  9. 虚拟机安装Windows7镜像
  10. Python抖音去水印_一步到位_一蓑烟雨任平生
  11. 无线通信蜂窝网络 的 覆盖范围
  12. 关于个人的年度小目标
  13. linux tuxedo查看服务进程数,tuxedo管理命令之tmboot与tmshutdown
  14. 二维数组的length如何理解
  15. 编写shell脚本运行python文件
  16. 2021数据库课程设计培训笔记:【JAVA】部分
  17. 软件工程基础个人项目——数独(5)
  18. Win10安装 sql2008 R2
  19. 考研 研究生 什么是考研 考研的第一课 全面了解考研 研究生
  20. sublime中文出现乱码怎么办?这里有办法

热门文章

  1. 在国内使用maven下载jar包非常慢的解决方法
  2. git svn clone
  3. easyui源码翻译1.32--LinkButton(按钮)
  4. 最小方法ZOJ 1579 Bridge
  5. ubuntu 10.04 下驱动程序的hello word
  6. 名言名人2008-11-22
  7. Hadoop-MapReduce
  8. 可局部放大图片的例子,局部放大图片,javascript局部放大图片
  9. ORACLE JOB间隔时间参考
  10. 绘图之使用工作空间直接绘图