Description

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都需要给出回答,聪明的程序员们,你们能帮助他吗?

Input

输入数据第一行包括2个数,n和m,分别表示序列的长度和操作数目 第二行包括n个数,表示序列的初始状态 接下来m行,每行3个数,op, a, b,(0<=op<=4,0<=a<=b<n)表示对于区间[a, b]执行标号为op的操作="" <="" div="">

Output

对于每一个询问操作,输出一行,包括1个数,表示其对应的答案

Sample Input

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

Sample Output

5
2
6
5

HINT

对于30%的数据,1<=n, m<=1000
对于100%的数据,1<=n, m<=100000

/*
不想写线段树,写的分块。
维护一下每个块的左最大连续区间,右最大连续区间,最大连续区间,和几个标记(无/全0/全1/取反)。
*/
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#define N 100010
#define M 510
using namespace std;
int a[N],bl[N],n,m,size;
int tag[M],lc0[M],rc0[M],sc0[M],lc1[M],rc1[M],sc1[M],sum[M]; void init(int i){
tag[i]=-;lc0[i]=rc0[i]=sc0[i]=lc1[i]=rc1[i]=sc1[i]=sum[i]=;
for(int j=(i-)*size+;j<=min(n,i*size);j++)
if(a[j]) sum[i]++;
int fl=,p=;
for(int j=(i-)*size+;j<=min(n,i*size);j++){
if(!a[j]&&!fl) lc0[i]++;
else fl=;
if(!a[j]) p++;else p=;
sc0[i]=max(sc0[i],p);
}
fl=;
for(int j=min(n,i*size);j>(i-)*size;j--){
if(!a[j]&&!fl) rc0[i]++;
else fl=;
}
fl=,p=;
for(int j=(i-)*size+;j<=min(n,i*size);j++){
if(a[j]&&!fl) lc1[i]++;
else fl=;
if(a[j]) p++;else p=;
sc1[i]=max(sc1[i],p);
}
fl=;
for(int j=min(n,i*size);j>(i-)*size;j--){
if(a[j]&&!fl) rc1[i]++;
else fl=;
}
} void pushdown(int i){
if(tag[i]==-) return;
if(tag[i]==||tag[i]==)
for(int j=(i-)*size+;j<=i*size;j++)
a[j]=tag[i];
else
for(int j=(i-)*size+;j<=i*size;j++)
a[j]^=;
tag[i]=-;
} void change1(int x,int y,int v){
pushdown(bl[x]);
for(int i=x;i<=min(y,bl[x]*size);i++) a[i]=v;
init(bl[x]);
for(int i=bl[x]+;i<bl[y];i++){
tag[i]=v;
if(v) lc1[i]=rc1[i]=sc1[i]=sum[i]=size,lc0[i]=rc0[i]=sc0[i]=;
else lc1[i]=rc1[i]=sc1[i]=sum[i]=,lc0[i]=rc0[i]=sc0[i]=size;
}
if(bl[x]==bl[y]) return;
pushdown(bl[y]);
for(int i=(bl[y]-)*size+;i<=y;i++) a[i]=v;
init(bl[y]);
} void change2(int x,int y){
pushdown(bl[x]);
for(int i=x;i<=min(y,bl[x]*size);i++) a[i]^=;
init(bl[x]);
for(int i=bl[x]+;i<bl[y];i++){
if(tag[i]==-) tag[i]=;
else if(tag[i]==) tag[i]=;
else if(tag[i]==) tag[i]=;
else tag[i]=-;
swap(lc0[i],lc1[i]);swap(rc0[i],rc1[i]);
swap(sc0[i],sc1[i]);sum[i]=size-sum[i];
}
if(bl[x]==bl[y]) return;
pushdown(bl[y]);
for(int i=(bl[y]-)*size+;i<=y;i++) a[i]^=;
init(bl[y]);
} int query1(int x,int y){
int ans=;
pushdown(bl[x]);
for(int i=x;i<=min(y,bl[x]*size);i++)
if(a[i]) ans++;
for(int i=bl[x]+;i<bl[y];i++) ans+=sum[i];
if(bl[x]==bl[y]) return ans;
pushdown(bl[y]);
for(int i=(bl[y]-)*size+;i<=y;i++)
if(a[i]) ans++;
return ans;
} int query2(int x,int y){
int ans=,l=;
pushdown(bl[x]);
for(int i=x;i<=min(y,bl[x]*size);i++){
if(a[i]) l++;else l=;
ans=max(ans,l);
}
for(int i=bl[x]+;i<bl[y];i++){
l+=lc1[i];
ans=max(ans,l);
ans=max(ans,sc1[i]);
if(lc1[i]!=size) l=rc1[i];
}
if(bl[x]==bl[y]) return max(ans,l);
pushdown(bl[y]);
for(int i=(bl[y]-)*size+;i<=y;i++){
if(a[i]) l++;else l=;
ans=max(ans,l);
}
return ans;
} int main(){
memset(tag,-,sizeof(tag));
scanf("%d%d",&n,&m);size=sqrt(n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
bl[i]=(i-)/size+;
}
for(int i=;i<=bl[n];i++) init(i);
int op,x,y;
for(int i=;i<=m;i++){
scanf("%d%d%d",&op,&x,&y);x++;y++;
if(op==) change1(x,y,);
if(op==) change1(x,y,);
if(op==) change2(x,y);
if(op==) printf("%d\n",query1(x,y));
if(op==) printf("%d\n",query2(x,y));
}
return ;
}

序列操作(bzoj 1858)的更多相关文章

  1. AC日记——[Scoi2010]序列操作 bzoj 1858

    1858 思路: 恶心: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct Tree ...

  2. bzoj 1858 序列操作

    bzoj 1858 序列操作 带有随机多个区间单值覆盖的区间操作题,可考虑用珂朵莉树解决. #include<bits/stdc++.h> using namespace std; #de ...

  3. (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作

    二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...

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

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

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

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

  6. [bzoj]2962序列操作

    [bzoj]2962序列操作 标签: 线段树 题目链接 题意 给你一串序列,要你维护三个操作: 1.区间加法 2.区间取相反数 3.区间内任意选k个数相乘的积 题解 第三个操作看起来一脸懵逼啊. 其实 ...

  7. 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 3397 Solved: 1624 [Submit][Statu ...

  8. bzoj 2962 序列操作

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 有一个长度为n的序列, ...

  9. bzoj 4831 [Lydsy1704月赛]序列操作 dp

    [Lydsy1704月赛]序列操作 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 203  Solved: 69[Submit][Status][Dis ...

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

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

随机推荐

  1. SOA架构设计案例分析

    转载自:https://www.jdon.com/soa.html 首先Martin Fowler提出SOA歧义Service Oriented Ambiguity,认为"什么是SOA&qu ...

  2. NodeJS--exports和module.exports

    继续迁移印象笔记中记录相关笔记,其实工作中遇到的很多问题当时解决了,后期就忘记了,多记录还是很有用的,好记性不如烂笔头嘛,以后要养成好习惯. NodeJS中 require 用来加载代码,而 expo ...

  3. 转:对比python 链接 neo4j 驱动,py2neo 和 neo4j-driver 和 neo4jrestclient

    Comparing Neo4j driver, py2neo and neo4jrestclient with some basic commands using the Panama Papers  ...

  4. LeetCode949-给定数字能组成的最大时间

    问题: 给定一个由 4 位数字组成的数组,返回可以设置的符合 24 小时制的最大时间. 最小的 24 小时制时间是 00:00,而最大的是 23:59.从 00:00 (午夜)开始算起,过得越久,时间 ...

  5. 两台centos之间使用scp命令传输文件

    1.将本地文件copy到远程 (1)复制文件 scp local_file remote_username@remote_ip:remote_folder 例如:将/usr/local/aa.png文 ...

  6. [转载]win10(64bit)上安装MySQL-python

    https://blog.csdn.net/builder_taoge/article/details/78292302 https://blog.csdn.net/qq_26808915/artic ...

  7. Codeforces Round #460 (Div. 2)-C. Seat Arrangements

    C. Seat Arrangements time limit per test1 second memory limit per test256 megabytes Problem Descript ...

  8. 源码级强力分析hadoop的RPC机制

    分析对象: hadoop版本:hadoop 0.20.203.0 必备技术点: 1. 动态代理(参考 :http://weixiaolu.iteye.com/blog/1477774 )2. Java ...

  9. BZOJ 1222: [HNOI2001]产品加工

    F[i]表示第一个机器用了i的时间,第二个机器的最小时间 转移即可 #include<cstdio> #include<algorithm> using namespace s ...

  10. WEBs

    http://www.cnblogs.com/wupeiqi/articles/5341480.html 请求方式8种: 1.GET:请求指定页面信息,并返回实体 2.POST:向指定资源提交数据进行 ...