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. SAP 日志管理

    现在项目上自开发的dialog程序越来越多,有很多敏感数据需要像SAP标准的业务一样,能看到所有的修改日志,要想实现日志的功能,有以下几个办法: 办法一.建一个日志表,在原有表的基础上,加上日期和时间 ...

  2. Java - 类加载的时候,是有缺省同步锁的

    类加载的时候,是有缺省同步锁的

  3. git Bash 学习

    ,ranh新建一个本地仓库并与github连接的方法 注:该终端也具有按tab键补全功能,应该合理应用 1. 新建一个文件夹,并将git bash的位置转到相应文件夹下(cd 命令转移) 2.git ...

  4. linux正则表达式企业级深度实践案例1

    linux正则表达式结合三剑客企业级实践: 1.取系统ip [root@redhat~]#  ifconfig  eth0 解答: 替换命令: sed  's#支持正则位置##g'  file 先取第 ...

  5. url地址形式的传参格式拼接

    例子一: var gid=pid=pizi=sn=newsn=sn_price=city_id=123; var params = 'gid=' +123; params += '&pid=' ...

  6. 将Web项目War包部署到Tomcat服务器基本步骤(完整版)

    1. 常识:   1.1 War包 War包一般是在进行Web开发时,通常是一个网站Project下的所有源码的集合,里面包含前台HTML/CSS/JS的代码,也包含Java的代码. 当开发人员在自己 ...

  7. Installing Apps Kattis - installingapps (贪心 + 背包)

    Installing Apps Kattis - installingapps Sandra recently bought her first smart phone. One of her fri ...

  8. ubuntu下eclipse c++开发

    linux下eclipse运行C++程序出现Launch Failed. Binary Not Found.错误 在unbutu16.04上安装eclipse c++,运行一个hello world程 ...

  9. Redis实现之链表

    链表 链表提供了高效的节点重排能力,以及顺序性的节点访问顺序,并且可以通过增删节点来灵活地调整链表的长度.作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用的C语言并没有内置这 ...

  10. 大数据面试(HR电话了解)

    1什么是HA集群? 所谓HA,即高可用(7*24小时不中断服务) HA集群是hadoop高可用集群,即有两个namenode,一个active,一个stanby,active的name挂掉之后,sta ...