题目大意

维护一个 \(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);
}
}

最新文章

  1. POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]
  2. [leetcode] 12. Integer to Roman
  3. C#读取Excel的三种方式以及比较
  4. 防止别人ping自己的服务器
  5. python RabbitMQ队列/redis
  6. 【C#】3.算法温故而知新 - 快速排序
  7. 最近用到这个强大的工具 PhysicsEditor (转)
  8. Android基于XMPP Smack openfire 开发的聊天室
  9. POJ3750: 小孩报数问题+一道经典约瑟夫问题(猴子选大王)
  10. 转载:mybatis和hibernate 解析
  11. 【ThinkPHP框架学习 】(2) --- 后台管理系统如何用iframe点击左边右边局部刷新
  12. 爬起点小说day03
  13. VLOOKUP函数常用套路大全
  14. Ubuntu14.04安装 HP DeskJet GT 5820 打印机的方法
  15. 深度学习与自动驾驶领域的数据集(KITTI,Oxford,Cityscape,Comma.ai,BDDV,TORCS,Udacity,GTA,CARLA,Carcraft)
  16. 【工利其器】必会工具之(三)systrace篇(2)
  17. windows2012服务器中安装php7+mysql5.7+apache2.4环境
  18. Can&#39;t connect to X11 window server using &#39;:1.0&#39; as the value of the DISPLAY variable.
  19. Redis不支持ssl
  20. Awvs、Snort的下载安装

热门文章

  1. 【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)
  2. Zabbix技术分享——使用Zabbix6.0监控业务日志
  3. mq中如何保证消息的顺序性
  4. 干电池升压5V,功耗比较低
  5. 《HTTP权威指南》– 4.HTTP连接管理
  6. 基于MongoDb的事件订阅实现hook监听
  7. [OpenCV实战]29 使用OpenCV实现红眼自动去除
  8. WebGoat-8.2.2靶场之不安全的反序列化漏洞
  9. bugku-source-wp详解
  10. angular Ionic CLI环境搭建安装以及栅格响应式布局