考虑建立一棵线段树,维护:1.左端点的连续1和;2.右端点的连续1和;3.最长1的连续子序列;4.1的个数;5.将0和1交换后上面的四项;6.懒标记
具体实现中,需要注意细节,可以看代码(比较短)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 struct ji{
8 int sum,ls,rs,ans;
9 }f0[N<<2],f1[N<<2];
10 int n,m,p,x,y,laz[N<<2];
11 ji merge(ji x,ji y){
12 if (x.sum<0)return y;
13 if (y.sum<0)return x;
14 ji z;
15 z.sum=x.sum+y.sum;
16 z.ls=x.ls+((x.ls==x.sum)&&(x.rs==x.sum)&&(x.sum))*y.ls;
17 z.rs=y.rs+((y.rs==y.sum)&&(y.ls==y.sum)&&(y.sum))*x.rs;
18 z.ans=max(max(x.ans,y.ans),x.rs+y.ls);
19 return z;
20 }
21 int merge(int x,int y){
22 if ((x<0)||(y<0))return x+y+1;
23 if ((x==2)&&(y==2))return -1;
24 if (x==2)return y^1;
25 return x;
26 }
27 void upd(int k,int l,int r,int x){
28 if (x<0)return;
29 if (x<2){
30 laz[k]=x;
31 f0[k].sum=f0[k].ls=f0[k].rs=f0[k].ans=(x^1)*(r-l+1);
32 f1[k].sum=f1[k].ls=f1[k].rs=f1[k].ans=x*(r-l+1);
33 return;
34 }
35 swap(f0[k],f1[k]);
36 if (laz[k]<0)laz[k]=2;
37 else
38 if (laz[k]>1)laz[k]=-1;
39 else laz[k]^=1;
40 }
41 void up(int k,int l,int r){
42 f0[k]=merge(f0[L],f0[R]);
43 f1[k]=merge(f1[L],f1[R]);
44 upd(k,l,r,-1);
45 }
46 void down(int k,int l,int r){
47 if (laz[k]<0)return;
48 upd(L,l,mid,laz[k]);
49 upd(R,mid+1,r,laz[k]);
50 laz[k]=-1;
51 }
52 void update(int k,int l,int r,int x,int y,int z){
53 if ((l>y)||(x>r))return;
54 if ((x<=l)&&(r<=y)){
55 upd(k,l,r,z);
56 return;
57 }
58 down(k,l,r);
59 update(L,l,mid,x,y,z);
60 update(R,mid+1,r,x,y,z);
61 up(k,l,r);
62 }
63 ji query(int k,int l,int r,int x,int y){
64 if ((l>y)||(x>r))return ji{-1,0,0,0};
65 if ((x<=l)&&(r<=y))return f1[k];
66 down(k,l,r);
67 return merge(query(L,l,mid,x,y),query(R,mid+1,r,x,y));
68 }
69 int main(){
70 scanf("%d%d",&n,&m);
71 for(int i=1;i<=n;i++){
72 scanf("%d",&x);
73 update(1,1,n,i,i,x);
74 }
75 for(int i=1;i<=m;i++){
76 scanf("%d%d%d",&p,&x,&y);
77 x++,y++;
78 if (p<3)update(1,1,n,x,y,p);
79 else{
80 ji o=query(1,1,n,x,y);
81 if (p==3)printf("%d\n",o.sum);
82 if (p==4)printf("%d\n",o.ans);
83 }
84 }
85 }

[bzoj1858]序列操作的更多相关文章

  1. scoi2010&&bzoj1858序列操作

    [题目描述] lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a ...

  2. 【BZOJ1858】序列操作(线段树)

    [BZOJ1858]序列操作(线段树) 题面 BZOJ 题解 这题思路很简单,细节很烦,很码 维护区间翻转和区间赋值标记 当打到区间赋值标记时直接覆盖掉翻转标记 下放标记的时候先放赋值标记再放翻转标记 ...

  3. 【BZOJ-1858】序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1961  Solved: 991[Submit][Status ...

  4. bzoj1858[Scoi2010]序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 3079  Solved: 1475[Submit][Statu ...

  5. BZOJ1858 [Scoi2010]序列操作(线段树)

    题目链接 [Scoi2010]序列操作 考验代码能力的一道好题. 思想还是很简单的(直接上线段树),但是比较难写. #include <bits/stdc++.h> using names ...

  6. Python通用序列操作

    1.序列概览 1.数据结构 序列.容器 Python中最基本的数据结构是序列,其有索引(从左到右第一个索引为0,从右到左第一个索引为-1). Python包含6中内建的序列: 列表 元组 字符串 Un ...

  7. 【BZOJ-2962】序列操作 线段树 + 区间卷积

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 678  Solved: 246[Submit][Status][Discuss] ...

  8. bzoj 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...

  9. BZOJ 1858: [Scoi2010]序列操作( 线段树 )

    略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...

随机推荐

  1. Java初步学习——2021.10.05每日总结,第五周周三

    (1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天学了对象与类,如何定义类和创建对象,以及构建方法的用法. 明天课比较多,把今天未学的例子敲一遍好了. 没有遇到什么问题.

  2. Java(13)详解构造方法

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201600.html 博客主页:https://www.cnblogs.com/testero ...

  3. 如何知道当前使用的python的安装路径

    电脑里多处安装了python,那么如何得知当前使用python的安装路径呢? 方法一 运行python指令: import sys print(sys.executable) 方法二 对于终端和Win ...

  4. BUAA2020软工团队beta得分总表

    BUAA2020软工团队beta得分总表 [TOC] 零.团队博客目录及beta阶段各部分博客地址 团队博客 计划与设计博客 测试报告博客 发布声明博客 事后分析博客 敏 杰 开 发♂ https:/ ...

  5. 第四次Scrum Metting

    日期:2021年4月29日 会议主要内容概述:交代近两日工作,进一步细化上次讨论细节,代码合并. 一.进度情况## 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 ...

  6. 【二食堂】Beta - Scrum Meeting 10

    Scrum Meeting 10 例会时间:5.25 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 继续文本导入.保存部分的工作issue 2. 完成了技术博客 1. 继续文 ...

  7. [技术博客]在团队中使用Pull Request来管理代码

    在团队中使用Pull Request来管理代码 前言 在参加多人共同开发项目,且选用Git作为代码托管工具的时候,我们不免会遇到分支冲突.覆盖.合并等问题.显然,因为同一个仓库是属于大家的,所以每个人 ...

  8. 【二食堂】Alpha - Scrum Meeting 6

    Scrum Meeting 6 例会时间:4.16 11:40 - 12:10 进度情况 组员 昨日进度 今日任务 李健 1. 文本区域进度40%,UI需要进行调整issue 1. 继续文本区域的开发 ...

  9. Allegro如何测量距离,测距工具的使用

    http://www.allegro-skill.com/thread-2480-1-1.html

  10. 集合先从ArrayList开始

    本篇文章非常建议直接从经典Demo开始哦~ 一.ArrayList简介 ArrayList 的底层是数组队列,相当于动态数组.与 Java 中的数组相比,它的容量能动态增长.在添加大量元素前,应用程序 ...