P2253 好一个一中腰鼓!

本蒟蒻第一次用线段树做连续最长子段


线段树是将一个大区间二分成两个小区间,通过递归解决两个小区间的问题,然后合并。得到大区间的解。

类比一下分治法求单个最长连续子段。

每次也都是将一个大区间分成两个小区间。分别解决完小区间后。将小区间合并,从分界点左右遍历。暴力的求连续子序列的长度。

然后将两个小区间分别作为一个区间求解的最优值和从分界点的连续子段长度比较,然后就得到了这个大区间的最长连续子段的长度。

可是,如果在线段树中呢?每次从分界点暴力的求时间复杂度太高。

那能不能预处理出来呢?

答案是肯定的。

我们可以如此想像。对于一次区间。他的最长连续子段能在什么位置呢?

无非就是在左右端点处开始或结束,或者是在区间内部(就是在最长连续子段中有可能没有左右节点)。我们只需要记录这三个值。

在递归合并时求从分界点的连续子段时只需要用从左区间以右端点结尾的连续子段接上右区间以左端点开始的连续子段就可以了。

至于可以接在一起的条件是什么。会在代码中讲解


那什么时候结束呢?也就是递归到了叶子节点(只有一个元素)。

所以我们先定义叶子的状态。

全是1.(左边开始的连续子段的长度,右边结束的连续子段的长度,在,在区间内部的连续子段的长度)

然后更改一个点后,处理他的父节点。如此边回溯边维护就可以了

#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
using namespace std;
struct node//线段树结构体
{int lf;//从左开始的连续子段长度  l:leftint mf;//在区间内部的连续子段长度 m:midint rf;//以右端点结束的连续子段的长度 r:right下同
};
node t[70100];//线段树数组
int turn[2]={1,0};//转变数组,也可以自己if
int base[70100];//记录是否被反转过,0为无,1为有
void push(int &root,int &l,int &r,int &m)
{int ls=root<<1;//left sonint rs=(root<<1)|1;//right sont[root].lf=t[ls].lf;//大区间的左端点开始的连续子段最起码是左区间以左区间左端点开头的连续子段if(base[m]!=base[m+1]&&m-l+1==t[ls].lf) //如果左区间整个都是连读的t[root].lf+=t[rs].lf;//在将右区间的以右区间开头的连续子段长度加上,下同t[root].rf=t[rs].rf;//处理大区间以右端点结尾的连续子段长度if(base[m]!=base[m+1]&&r-m==t[rs].rf) t[root].rf+=t[ls].rf;t[root].mf=max(t[ls].mf,t[rs].mf);//在大区间内的连续子段,这一步请类比分支if(base[m]!=base[m+1])//左右区间拼接t[root].mf=max(t[root].mf,t[ls].rf+t[rs].lf);return ;
}
void build(int root,int l,int r)
{if(l==r)//叶子节点的初状态{t[root].lf=1;t[root].mf=1;t[root].rf=1;return ;}int mid=(l+r)>>1;build(root<<1,l,mid);build((root<<1)|1,mid+1,r);push(root,l,r,mid);//用他两个儿子更新自己,这里用作初始化return ;
}
void updata(int root,int l,int r,int a)
{if(l>a||r<a)return ;if(l==a&&r==a){base[l]=turn[base[l]];return ;//更改}int mid=(l+r)>>1;updata(root<<1,l,mid,a);updata((root<<1)|1,mid+1,r,a);push(root,l,r,mid);//维护线段树return ;
}
int main()
{int n,m;//输入不解释scanf("%d%d",&n,&m);build(1,1,n);int a;for(int i=1;i<=m;i++){scanf("%d",&a);updata(1,1,n,a);printf("%d\n",max(t[1].lf,max(t[1].mf,t[1].rf)));//手动max}
}

转载于:https://www.cnblogs.com/Lance1ot/p/8671881.html

P2253 好一个一中腰鼓!相关推荐

  1. noip2017考前整理(未完)

    快考试了,把我以前写过的题回顾一下. Noip2007 树网的核:floyd,推出性质,暴力. Noip2008 笨小猴:模拟 Noip2008 火柴棒等式:枚举 Noip2008 传纸条:棋盘dp ...

  2. 哪有那么多BAT的逆袭?

    转行能够逆袭进入BAT固然不错,但是怎么可能人人都逆袭呢?也许,更多的人会像本文的主人公dual一样,转行,奋斗,最后改变命运. 1 大学 2013 年高考,我的分数可以报一所不错的三本,但是考虑到三 ...

  3. PyGame 英文打字游戏

    专属于你的导航栏 1.回忆篇 2.正文篇 3.结尾篇 回忆篇 回想起初中时候,语文老师(陈老师)教的知识. 这篇文章的开头主要有什么作用? 答: 1.开门见山,点出文章主题,为下文做铺垫,讲述了... ...

  4. java---解惑--

    Java谜题1--表达式谜题 谜题1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转吗? public static boolean isOdd(int i){  ret ...

  5. [日常] 面试知识点总结(持续更新)

    数据结构和算法:物理结构和逻辑结构1.逻辑结构(集合结构,线性结构,树形结构,图形结构)2.物理结构一般是讲内存,顺序存储结构,链式存储结构浅谈算法中,高斯算法从1加到100,循环的话是100次,高斯 ...

  6. 堆栈计算机的原理和实现

    堆栈计算机的原理和实现 原书< Stack Computers: the new wave > (原书封面) 原作者 Philip J. Koopman, Jr. 编译者 赵宇 张文翠 这 ...

  7. Python3 OpenCV4 计算机视觉学习手册:6~11

    原文:Learning OpenCV 4 Computer Vision with Python 3 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集] ...

  8. 【题库】计算机二级选择题

    一.公共基础知识 考10分 二.计算机基础 考4分 三.Office操作 考6分 一.公共基础知识 考10分 1.下列叙述中正确的是 A)所谓算法就是计算方法 B)程序可以作为算法的一种描述方法 C) ...

  9. 计算机怎么会复制两份怎么解决,有两个表格,要把其中一个的内容复制到另一中,但又不是全部,怎么办...

    网友求助:有两个表格,要把其中一个的内容复制到另一中,但又不是全部,怎么办 问题表一 姓名 学号 甲 123123 乙 123122 丙 123121 丁 123132 戊 123121 己 1322 ...

最新文章

  1. 《计算机网络》读书笔记(一)--计算机网络体系结构
  2. WampServer + phpcms 开发中,浏览器 localhost 出现 Cannot to connect to mySQL server 的原因分析和解决办法?
  3. Oracle备份还原操作方法
  4. 百面机器学习—3.逻辑回归与决策树要点总结
  5. 记飞机大战小游戏1.0
  6. 前端随心记---------WebSocket
  7. seaweedfs-client适配高版本的seaweedfs服务
  8. SpringBoot RabbitMQ 异步激活_注册邮箱
  9. 看红帽巨佬解析⭐《二、G1垃圾回收配置解析》⭐
  10. 批量导出二维码并生成压缩文件
  11. java 开发工具eli_二进制开发ELI5 –第1部分
  12. 1371: 三位数求解
  13. android N编译
  14. Python pandas.pivot_table学习笔记1
  15. VUE—下载安装并使用mint ui(图文详情)
  16. 51单片机实战教程(34 线缆摇摆测试机设计)
  17. 住房公积金专办员考试多少分及格?考试难不难?
  18. 《禅与摩托车维修艺术》读后感第一篇
  19. SQL注入测试平台 SQLol -2.SELECT注入测试
  20. 【老达人吐血整理】800种绘本的小达人点读包下载

热门文章

  1. rake -T 列出所有RAKE 命令.
  2. Android 自定义属性时TypedArray的使用
  3. C++中关于内部与外部函数
  4. python IO编程-StringIO和BytesIO
  5. Python 模块之heapq
  6. SpringMVC基础配置与简单的SpringMVC的程序
  7. Android中的资源复用小技巧
  8. day17.Python中lambda表达式应用
  9. 深度模拟java动态代理实现机制系类之三
  10. android系统action大全