序列操作
Posted aprincess
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列操作相关的知识,希望对你有一定的参考价值。
题目描述
lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作:
0 a b 把[a, b]区间内的所有数全变成0
1 a b 把[a, b]区间内的所有数全变成1
2 a b 把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,把所有的1变成0
3 a b 询问[a, b]区间内总共有多少个1
4 a b 询问[a, b]区间内最多有多少个连续的1
对于每一种询问操作,lxhgww都需要给出回答,聪明的程序员们,你们能帮助他吗?
输入格式
输入数据第一行包括2个数,n和m,分别表示序列的长度和操作数目
第二行包括n个数,表示序列的初始状态
接下来m行,每行3个数,op, a, b,(0<=op<=4,0<=a<=b<n)表示对于区间[a, b]执行标号为op的操作
输出格式
对于每一个询问操作,输出一行,包括1个数,表示其对应的答案
输入输出样例
输入
10 10
0 0 0 1 1 0 1 0 1 1
1 0 2
3 0 5
2 2 2
4 0 4
0 3 6
2 3 7
4 2 8
1 0 5
0 5 6
3 3 9
输出
5
2
6
5
说明/提示
对于30%的数据,1<=n, m<=1000
对于100%的数据,1<=n, m<=100000
询问总共有多少个1 可以直接维护区间和sum来解决
询问最多有多少个连续的1 可以考虑维护 一个节点对应区间的 maxl 与 maxr;分别代表左边开始最多的连续1的数目和右边开始最多的连续的1的数目
因为还有把0和1交换的操作
所以同时再维护一下一个区间的0的个数和sum0,以及连续的0的数目
tag的话 一个tag表示置0、置1或当前没有置01的操作 另一个tag表示翻转区间的0和1 遇到翻转时,可以直接修改置01的tag,遇到置01时,直接删除掉翻转tag,这里的更新操作是什么可以思考一下
以上是关于序列操作的主要内容,如果未能解决你的问题,请参考以下文章