题目大意

维护一个 \(01\) 序列最长的连续相邻两个数不同的子序列的长度

解析

很裸的线段树题。。。

要维护的信息很多

  • 区间长度
  • 区间最左端点
  • 区间最右端点
  • 区间最长前缀
  • 区间最长后缀
  • 区间最终的答案

    前三个直接从左右儿子获取即可

区间最长前缀先为左儿子的区间最长前缀

如果左儿子的区间最长前缀为左区间的长度,那么考虑它能不能和右儿子拼接,更新答案

右区间最长前缀同理

最终答案是 左儿子的最终答案,右儿子的最终答案,左儿子和右儿子能否拼接的答案,本区间的最长前缀,本区间的最长后缀 中的最大值

于是你明白了为什么要维护辣么多东西

\(Code\)

#include<cstdio>
#include<iostream>
#define ls (k << 1)
#define rs (ls | 1)
using namespace std; const int N = 2e5 + 5;
int n , q; struct segment{
int len , l , r , p , s , v;
}seg[N << 2]; inline void pushup(int k)
{
seg[k].l = seg[ls].l , seg[k].r = seg[rs].r;
seg[k].len = seg[ls].len + seg[rs].len;
seg[k].p = seg[ls].p;
if (seg[ls].p == seg[ls].len && seg[ls].r ^ seg[rs].l) seg[k].p = seg[ls].p + seg[rs].p;
seg[k].s = seg[rs].s;
if (seg[rs].s == seg[rs].len && seg[ls].r ^ seg[rs].l) seg[k].s = seg[rs].s + seg[ls].s;
seg[k].v = (max(seg[k].p , seg[k].s) , max(seg[ls].v , seg[rs].v));
if (seg[ls].r ^ seg[rs].l) seg[k].v = max(seg[k].v , seg[ls].s + seg[rs].p);
} inline void build(int l , int r , int k)
{
if (l == r)
{
seg[k].l = seg[k].r = 0;
seg[k].len = seg[k].p = seg[k].s = seg[k].v = 1;
return;
}
int mid = (l + r) >> 1;
build(l , mid , ls) , build(mid + 1 , r , rs);
pushup(k);
} inline void update(int x , int l , int r , int k)
{
if (l == r && l == x)
{
seg[k].l = seg[k].r = seg[k].l ^ 1;
return;
}
int mid = (l + r) >> 1;
if (x <= mid) update(x , l , mid , ls);
else update(x , mid + 1 , r , rs);
pushup(k);
} int main()
{
scanf("%d%d" , &n , &q);
build(1 , n , 1);
int x;
for(; q; q--)
{
scanf("%d" , &x);
update(x , 1 , n , 1);
printf("%d\n" , seg[1].v);
}
}

[COCI2010-2011#6] STEP的更多相关文章

  1. Step by step Dynamics CRM 2011升级到Dynamics CRM 2013

    原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...

  2. [ZZ] Understanding 3D rendering step by step with 3DMark11 - BeHardware >> Graphics cards

    http://www.behardware.com/art/lire/845/ --> Understanding 3D rendering step by step with 3DMark11 ...

  3. Step by Step

    数据库设计Step by Step篇目整理及下载地址 系列篇目 1. 数据库设计 Step by Step (1)——扬帆启航 2. 数据库设计 Step by Step (2)——数据库生命周期 3 ...

  4. Error 18000 during outlook 2011 rebuild

    Thanks Rob 88 Via:https://discussions.apple.com/message/23726703#23726703 1. Make a duplicate copy o ...

  5. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(三)

    http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2340661.html MS CRM 2011的自定义和开发(11)——插件(plugin ...

  6. WinForm RDLC SubReport Step by step

    最近在做的一个PO管理系统,因为要用到订单打印,没有用水晶报表,直接使用VS2010的Reporting.参考了网上的一些文章,但因为找到的数据是用于WebForm的,适配到WinForm有点区别,竟 ...

  7. [SinGuLaRiTy] COCI 2011~2012 #2

    [SinGuLaRiTy-1008] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 测试题目 对于所有的题目:Time Limit:1s   ...

  8. Step by step guide to set up master and slave machines on Windows

    Note: There is no need to install Jenkins on the slave machine. On your master machine go to Manage ...

  9. Quest for sane signals in Qt - step 1 (hand coding a Q_OBJECT)

    探索qt的信号ref: http://crazyeddiecpp.blogspot.hk/2011/01/quest-for-sane-signals-in-qt-step-1.html If it ...

  10. NOIP 2011 Day 1

    NOIP 2011 Day 1 tags: NOIP 搜索 categories: 信息学竞赛 总结 铺地毯 选择客栈 Mayan游戏 铺地毯 Solution 因为只会询问一个点被谁覆盖, 而且后面 ...

随机推荐

  1. 这么简单,还不会使用java8 stream流的map()方法吗?

    一.前言 在日常的开发工作中经常碰到要处理list中数据的问题,比如从数据库中查出了很多学生,由于一些原因需要在内存中找出这些学生中的所有姓名,或者把名为"王五"的语文成绩暂时修改 ...

  2. java面试题-线程

    简述线程.程序.进程的基本概念.以及他们之间关系是什么? 系统运行程序到停止就是一个进程创建到消亡的过程,而线程则是进程的更小单位 线程有哪些基本状态? 初始,运行中,等待,阻塞,超时,终止1 关注公 ...

  3. web框架推导 wsgiref模块 jinja2模板语法 django框架简介 django基本操作

    目录 纯手撸web框架 web框架的本质 手写web框架 存在的问题 基于wsgiref模块 基本介绍 推导流程 代码封装优化 总结 动静态网页 jinja2模块 前端.后端.数据库三者联动 推导流程 ...

  4. 东拼西凑学java

    前言 随着大环境的影响,互联网寒冬降临,程序员的日子越来越难,搞不好哪天就被噶了,多学点东西也没啥坏处,国内市场java如日中天,出门在外不会写两行java代码,都不好意思说自己是程序员,伪装成一个萌 ...

  5. 几种数据库jar包获取方式

    摘要:以下提供的都是各个数据库较为官方的jar包获取方式. 本文分享自华为云社区<JDBC连接相关jar包获取及上传管理中心白名单处理>,作者:HuaWei XYe. jar包获取 以下提 ...

  6. Kagol:2022年最值得推荐的前端开源文章

    大家好,我是 Kagol,Vue DevUI 作者,从2020年开始一直专注于前端开源组件库的建设,在前端开源组件库.开源社区运营方面积累了一些经验,2020年主要的创作也是围绕前端组件库和开源两个主 ...

  7. 3、swagger调试

    Swagger: 1.将项目中所有的接口展现在页面上,这样后端程序员就不需要专门为前端使用者编写专门的接口文档: 2.当接口更新之后,只需要修改代码中的Swagger描述就可以实时生成新的接口文档了, ...

  8. 数据库连接池的一些基本理解,c3p0和druid

    数据库连接池 1,概念: 其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来采访数据时,从容器中获取连接对象,用户访问完后,会将连接对象 ...

  9. APICloud平台使用融云模块实现音视频通话实践经验总结分享

    需求概要:实现视频拨打.接听.挂断.视频界面大小窗口.点击小窗口实现大小窗口互换. 实现思路:一方拨打后,另一方要能收到相应事件,然后接听.接通后,渲染对方视频画面.那么己方视频画面什么时候渲染呢?对 ...

  10. [OpenCV实战]43 使用OpenCV进行背景分割

    运动背景分割法Background Segment主要是指通过不同方法拟合模型建立背景图像,将当前帧与背景图像进行相减比较获得运动区域.下图所示为检测图像: 通过前面的检测帧建立背景模型,获得背景图像 ...